3

私はいくつかのエンティティを持っています:

  public class Album extends GenericAuditedEntity {

    @OneToMany(fetch = FetchType.LAZY)
    private Set<Item> itemSet = new HashSet<Item>();
  }  

そして、次のように HQL を実行すると: em.createQuery("select a from Album a").getResults()

多くの SQL クエリを生成します。アルバムのテーブルからデータを選択するためのものです。次のように: select .... from Album_table; そして、アイテムを選択するために、フェッチされた行ごとに 1 つのクエリ。次のように: select .... from Item_table iwhere i.Album_id = :Album_id;

しかし、私が em.createQuery(" select a.id, b.id from Album a left join Item i ").getResults() を実行すると

1 つの SQL クエリを生成します。しかし、結果はいくつかのパラメーターのリストであり、手動でエンティティに入れる必要があります。

結合を使用して HQL を自動的に構築し、結果をエンティティに自動的に配置するにはどうすればよいですか? 出来ますか?

4

3 に答える 3

3

join fetchを使用する必要があります:

em.createQuery("select a.id, b.id from Album a left join fetch Item i ").getResults();

上記のリンクで詳細に説明されている特定の副作用があることに注意してください。

于 2009-09-24T16:24:49.513 に答える
2

使用している場合join fetch、ID は必要ありません。エンティティを取得できます。これは、Hibernate が最初のレベルのキャッシュにも関連付けを設定するためです。

em.createQuery("select a from Album a left join fetch a.itemSet").getResultList();

ただし、ID を取得しているが、オブジェクト/エンティティを設定したい場合は、コンストラクターの使用を検討してください。

em.createQuery("select new com.xxx.AlbumItem(a.id, b.id) from Album a left join fetch a.itemSet b").getResultList();
于 2009-09-24T17:02:03.480 に答える
-1

遅延フェッチを使用しないでください。取得タイプを熱心に設定する

于 2009-09-24T15:30:16.990 に答える