私はhibernate 3.6.4.Finalとsql server 2008 r2を使用しており、2000万を超えるレコードを持つテーブルに対してクエリを受け取りました。条件firstResult
/maxResult
を使用しているときにページング(結果100000〜100010の場合はselect top 100010 from ...
)を実行すると、apiが不適正にサブオプティマナルクエリを生成するため、ネイティブSQLに戻しました。名前付きパラメータの主なパフォーマンスの低下とネイティブSQLでのhibernateを使用したSQLインジェクションの防止
このクエリは、SQL Studioで驚くほど速く実行されますが、名前付きパラメータまたは定位置パラメータを使用してこれらのクエリを冬眠させると痛みを伴います。 Google検索では解決策が見つかりませんでしたので、現在SQLインジェクションを許可するパラメータを連結していますが、これはもちろん生産のオプションではありません。
私が見落としたことがあるかどうか、または私が自分自身を圧延する前にパラメータを消毒するために使用することができ、おそらくいくつかの端をつかまえていないことに気づいていない少なくともいくつかの休止状態のAPIやライブラリがあるかどうかは疑問です。
String stringQuery ="select * from User as u where id = :id";
Query query=session.createQuery(stringQuery);
query.setParameter("id",12);
:..私は元の平均、
HQLは基準を使用するのと同じ理由で不可能ですnoオプションをされて使用していませんとにかくほとんどのデータは破棄されます。例えば。 'setMaxResults(10)'と 'setFirstResult(100000)'はデータベースから100010のエントリをロードします: 'select top 100010 ...' –
ページ付けをしたい場合:次のコードを使ってurクエリを実行しますString sqlString = myQueryBuilder.buildQuery (5).unwrap(org.hibernate.Query.class).getQueryString(); 次にconcat:sqlString + = "limit x、y"; –
'limit'はMySQL固有であり、MS SQL Serverでは利用できません。同じテクニックは適用されません。なぜなら、ページングでは 'with X as(テーブルtからの行としてrow.number(order by ...)を選択します)select * from X where row> = xおよびrow < y'は、row_number関数をhibernate生成クエリに挿入し、外部クエリを追加する必要があります。 –