73

私はいくつかの回答を読んでいますが、まだ混乱しています。どうして?あなたが言及した違いはパフォーマンスとは関係がないからです。それらは使いやすさに関連しています。(オブジェクト(基準)とSQL(hql))。しかし、何らかの理由で「基準」がhqlより遅いかどうかを知りたいです。

これを別の回答で読みました

「HQL と criteriaQuery の間にはパフォーマンスの点で違いがあります。criteriaQuery を使用してクエリを起動するたびに、テーブル名の新しいエイリアスが作成されますが、これはどの DB に対しても最後にクエリされたキャッシュに反映されません。これにより、次のオーバーヘッドが発生します。生成された SQL をコンパイルしているため、実行に時間がかかります。」ヴァルン・メータ著。

これは非常に近いですが!別の Web サイト (http://gary-rowe.com/agilestack/tag/hibernate/) を読みました。これは、Hibernate 3.3 以降では当てはまりません (これを読んでください: 9)。基準インターフェースが一貫していません)

違いを見つけるためにいくつかのテストを行いましたが、どちらもqryを生成し、エイリアスをテーブルに変更しません。

私はとても混乱しています。誰かが主な理由を知っていれば、私たちを助けてください。ありがとう

4

5 に答える 5

154

私は 2004 年に Hibernate 3 クエリ トランスレータを書いた人物なので、その仕組みについてある程度は知っています。

基準は、理論的には HQL クエリよりもオーバーヘッドが少ないはずです (後で説明する名前付きクエリを除く)。これは、Criteria が何も解析する必要がないためです。HQL クエリは ANTLR ベースのパーサーで解析され、結果の AST が SQL に変換されます。ただし、HQL/JPAQL を使用すると、SessionFactory の起動時に SQL が生成される名前付きクエリを定義できます。理論的には、名前付きクエリは Criteria よりもオーバーヘッドが少なくなります。

したがって、SQL 生成のオーバーヘッドに関しては、次のようになります。

  1. 名前付き HQL/JPAQL クエリ - SQL 生成は 1 回だけ行われます。
  2. 基準 - 生成前に解析する必要はありません。
  3. (名前なし) HQL/JPAQL クエリ - 解析してから生成します。

とはいえ、解析と SQL 生成のオーバーヘッドに基づいてクエリ手法を選択することは、おそらく間違いだと思います。このオーバーヘッドは、実際のデータを使用して実際のデータベース サーバーで実際のクエリを実行する場合と比較すると、通常は非常に小さいものです。アプリのプロファイリング時にこのオーバーヘッドが実際に表示される場合は、名前付きクエリに切り替える必要があります。

Criteria と HQL/JPAQL のどちらを選択するかを決定する際に考慮すべき点は次のとおりです。

  • まず、コード内で Hibernate 独自の API に依存することに問題がないかどうかを判断する必要があります。JPAには基準がありません。
  • Criteria は、典型的な Web ページに見られる複数パラメータの「検索フォーム」など、多くのオプションの検索パラメータを処理するのに非常に優れています。HQL を使用すると、開発者は StringBuilder を使用して where 句の式を追加する傾向があります (これは避けてください! )。Criteria では、その必要はありません。Hardik も同様の意見を投稿しました。
  • HQL/JPAQL は、コードが小さくなり、開発者が理解しやすい傾向があるため、他のほとんどの用途に使用できます。
  • HQL を使用すると、非常に頻繁なクエリを名前付きクエリに変換できます。プロファイリングを行った後、後でこれを行うことを好みます。
于 2011-01-22T20:59:36.877 に答える
9

私は何百万ものレコードに取り組んでいます。HQL は Criteria よりもはるかに高速であることがわかりました。基準はパフォーマンスが大幅に遅れます。

大量のデータを扱う場合は、HQL を使用してください。

于 2012-11-14T01:19:13.780 に答える
7

HQL に対する Criteria のその他の利点:

HQLを書くとコードがぐちゃぐちゃになります。きれいなオブジェクト指向コードを書いているようには見えません。

基準クエリを記述している間、IDE は Intellisense を提案するので、二重引用符で囲まれた変数名などを記述する場合を除いて、間違いを犯す可能性は低くなります。

于 2016-07-11T07:35:35.647 に答える
7

私は主に動的クエリの基準クエリを好みます。たとえば、いくつかのパラメータに応じて、いくつかの順序を動的に追加したり、いくつかの部分 (制限など) を除外したりする方がはるかに簡単です。

一方、静的で複雑なクエリには HQL を使用しています。これは、HQL の方が理解しやすく読みやすいためです。また、HQL はもう少し強力だと思います。たとえば、さまざまな結合タイプに対してです。

JPA と Hibernate - 基準と JPQL または HQL の比較

于 2011-01-13T10:23:55.717 に答える
4

あなたは正しく、そうではありません。結果リストは、クラスを使用してデータベースまたはキャッシュから取得されますorg.hibernate.loader.Loader。キャッシュが有効でない場合、準備済みステートメントは、SessionFactoryImp で作成された Dialect オブジェクトを使用してビルドされます。したがって、ステートメントはリスト呼び出しごとに初期化されます。また、低レベルのクエリが自動的に生成されます。基本的には補助ですが、特定のクエリは手動で書いた方が効果的な場合があります。

于 2016-11-05T08:34:06.800 に答える