2012-02-17 4 views
1

これらのHibernateクエリに関する問題を手伝ってください。Hibernate queringに関する一連の質問

は、以下の構造を考慮してください

@Entity 
class Manager { 
    @OneToMany 
    List<Project> projects; 
} 

0)HQLの動的フェッチの2つの可能な方法がある:

  • マネージャmから選択M m.projects
  • を結合しますマネージャmからm.projectsをフェッチする。

私の設定では、リスト内のオブジェクトの数が正しくないデカルト積の結果を常に返しますが、最初のリストは常にリスト内の正しい数のエンティティを返します。しかし、SQLクエリは同じように見えます。これは、 "select"節がメモリ内のリストから冗長なオブジェクトを削除することを意味しますか?この場合は、を使用して本のアドバイスを参照することは奇妙です...を選択すると、冗長なエンティティを取り除くことができます。これらの2つのクエリが異なる結果を返す理由が間違っているとしたら?

  1. 私は私の休止状態SQLログに古典N + 1セレクト問題の出力を参照して上記2つの方法のいずれかによって動的フェッチを利用する場合。実際、FetchModeアノテーション(副選択または結合)は動的にフェッチしている間は電源を持っていません。私は本当にこの特定のケースでn + 1の問題を解決できませんか?

  2. Hibernate Criteria APIはジェネリックをサポートしていません。私は正しい?代わりにJPA Criteria APIを使用する必要があるようですか?

  3. エンティティ名パラメータを使用してHQLクエリを記述することはできますか?たとえば、 "from:myEntityParam p where p.id = 1"とし、その後にsetParameter( "myEntityParam"、MyClass.class)を呼び出します。実際に私が望むのは、ジェネリックなHQLクエリで、複数の非ジェネリックDAOを1つの汎用的なものに置き換えることです。それはあなたが選択したいものを伝えることができ、そしてとにかくJPQLで必須ですので

答えて

3

0)私はいつも、select句を使用します。 :あなたは自分のプロジェクトで管理者を選択したい場合は、個別のキーワードを使用しない場合は、リストには含まれていますn(nはマネージャーのプロジェクトの数である)、各マネージャのインスタンス

select distinct m from Manager m left join fetch m.projects 

を使用Hibernateは、結果セットに行がある場合と同じくらい多くの要素を返します。

1)あなたは、N + 1つの問題を回避したい場合は、同じクエリ内の他の関連フェッチ:

select distinct m from Manager m 
left join fetch m.projects 
left join fetch m.boss 

あなたはまた、例えば(10のボスをロードするためのバッチフェッチを設定すること)時を最初のボスにアクセスしたとき。参照文書で「バッチ取り出し」を検索します。

2)Hibernate API全体が生成されません。ジェネリックスの前にJDK 1.4で作られています。それが役に立たないというわけではありません。

3)いいえ.HQLクエリパラメータは、最終的には、プリペアドステートメントパラメータです。これを行うには、文字列連結を使用する必要があります。

関連する問題