2011-07-01 10 views
0

私は、ドライバとMsSqlのVARCHARとNVARCHARの不一致が原因であると考えています。Getting Hibernate and SQL Server to play nice with VARCHAR and NVARCHARのhibernateのクエリがあります。私はこの問題がHibernateではなく、以下のコードで休止状態を処理する方法に混乱していることを理解しています。VarChar MsSql列のさまざまなHibernateクエリのパフォーマンスの相違

カラム 'code'のVARCHARカラム型のDB上で、以下のクエリを実行したとき(setパラメータを使用し、それを使用しない場合)、HQLの文字列を追加するほうが速く動作することがわかりました。setParameter(またはCriteria QueryこれはHQLより高速だったはずです)。

Query createQuery = session.createQuery("from abc where code='"+substring+"'"); 
/*Query createQuery = session.createQuery("from abc where code=:substring"); 
       createQuery.setParameter("substring","Test");*/ 
       return createQuery.list(); 

これがどのように異なるのか教えてください。

答えて

0

データベースによって計算された実行計画は、おそらく2つのクエリで異なります。同様の問題がthis questionに記載されています。私のDBAは、Oracleにも同様の問題が発生する可能性があると私にすでに言っていました。

+0

しかし、なぜ私のCriteria Queryは遅くなりますか? 。 sendStringParametersAsUnicode = falseを設定すると、パラメータを追加するクエリと同じパフォーマンスが得られるので、私は混乱しています。 HQLのsetParameterは、Criteriaと同じパフォーマンスを与えるようです。ですから、DBのVARCHARの問題を解決するために何かをしているQueryに直接パラメータを追加していますか? –

+0

HQLクエリにパラメータがない場合(つまり、文字列連結を使用し、クエリでsetParameterを呼び出す必要がない場合)、JDBCドライバには送信するパラメータがありません。この場合、sendStringParametersAsUnicodeは無関係です。パラメータ化されたHQLクエリがある場合、またはCriteria APIを使用する場合、Hibernateはプリペアドステートメントを生成し、JDBCドライバはパラメータを送信します。この場合、sendStringParametersAsUnicodeは関連しています。 –

+0

@Nizet:今すぐ取得します。たくさんありがとうございます。 –

関連する問題