私はいくつかの質問を読んでいますが、私はまだ混乱しています。なぜ?あなたが言及した違いはパフォーマンスに関係しないからです。それらは簡単な使用と関連しています(Objetc(criteria)およびSQL(hql))。しかし、何らかの理由で「基準」がhqlより遅いかどうかを知りたいです。
これを別の回答で読んだ
「HQLとcriteriaQueryのパフォーマンスには違いがあります。criteriaQueryを使用してクエリを実行するたびに、DBの最後にクエリされたキャッシュに反映されないテーブル名の新しいエイリアスが作成されます。これにより、生成されたSQLをコンパイルし、実行するのにより多くの時間がかかります。」バルン・メタによる。
これは非常に近いですが、!私は別のウェブサイト(http://gary-rowe.com/agilestack/tag/hibernate/)を読みます。これはHibernate 3.3以上ではもはやありません(これを読んでください:9)基準インターフェースに一貫性がありません)
違いを見つけようといくつかのテストを行いましたが、どちらもqryを生成し、テーブルのエイリアスを変更しません。
私はとても混乱しています。誰かが主な理由を知っている場合は、助けてください。ありがとう
2004年にHibernate 3クエリトランスレータを作成したのは私です。そのため、その仕組みについては何か知っています。
基準は、理論的には、HQLクエリよりもオーバーヘッドが少ないはずです(名前付きクエリは除きます)。これは、Criteriaが何も解析する必要がないためです。 HQLクエリはANTLRベースのパーサーで解析され、結果のASTはSQLに変換されます。ただし、HQL/JPAQLでは、SessionFactoryの起動時にSQLが生成される名前付きクエリを定義できます理論的には、名前付きクエリはCriteriaよりもオーバーヘッドが少なくなります。
そのため、SQL生成のオーバーヘッドに関しては次のとおりです。
つまり、解析とSQL生成のオーバーヘッドに基づいてクエリ手法を選択することは、おそらく間違いです。通常、このオーバーヘッドは、実際のデータを使用して実際のデータベースサーバーで実際のクエリを実行する場合に比べて非常に小さくなります。アプリのプロファイリング時にこのオーバーヘッドが実際に現れる場合は、maybe名前付きクエリに切り替える必要があります。
基準とHQL/JPAQLを決定する際に考慮すべきことは次のとおりです。
私は何百万もの記録に取り組んでいます。 HQLはCriteriaよりもはるかに高速であることがわかりました。基準はパフォーマンスが大幅に遅れます。
大量のデータを処理する場合は、HQLに進みます。
HQLに対する基準のその他の利点:
HQLを記述すると、コードが煩雑になります。きれいなオブジェクト指向コードを書くことはもうありません。
Criteria Queriesの作成中、IDEはIntellisenseを使用することを示唆しているため、変数名のようなものを二重引用符で記述する場合を除き、間違いを犯す可能性は低くなります。
私は、動的なクエリに基準クエリを最も好んでいます。たとえば、パラメータに応じて、いくつかの順序を動的に追加したり、一部の部分(制限など)を残したりする方がはるかに簡単です。
一方、静的で複雑なクエリにはHQLを使用しています。HQLの理解と読み取りがはるかに簡単だからです。また、HQLはもう少し強力です。さまざまな結合タイプ用。
あなたは正しいです。結果リストは、org.hibernate.loader.Loader
クラスを使用してデータベースまたはキャッシュから取得されます。キャッシュが有効になっていない場合、SessionFactoryImpで作成されたDialectオブジェクトを使用して準備済みステートメントが構築されます。したがって、ステートメントはリスト呼び出しごとに初期化されます。また、低レベルのクエリが自動的に生成されます。基本的に、これは援助ですが、手動で記述した場合に特定のクエリがより効果的になる場合があります。