4

DB に親テーブルと子テーブルがあり、対応するエンティティ クラスに OneToMany マッピングがあります。子テーブルには外部キーのparent_idがあります。Hibernate と MySQL DB で JPA 2 を使用しています。

SQL ネイティブ クエリを使用して、親プロパティに基づいて、すべての親オブジェクトとそれに対応する子オブジェクトを取得したいと考えています。

そのために、次のように SqlResultSetMapping があります。

@SqlResultSetMapping(name="ParentsWithChildren",
       entities={ @EntityResult(entityClass = Parent.class),
                  @EntityResult(entityClass = Child.class)})

次のように問い合わせています。

String queryString = "select p.*, c.* from parent p left join child c on p.id = c.parent_id where p.property = <some_property>";
Query query = entityManager.createNativeQuery(queryString, "ParentsWithChildren");
List<Object[]> resultList =  query.getResultList();

結果リストをたどると、出力に示すように、子テーブルの異なる行に重複する子オブジェクトが見つかりました。

for(Object obj[]: resultList){
      Parent parent = (Parent) obj[0];
      Child child = (Child) obj[1];
      System.out.println("Parent: " + parent + ", Child: " + child);
}

出力:

Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1
Parent: Parent@3966c600, Child: Child@1

これがなぜなのかわかりません。ネイティブ クエリを使用してすべての (異なる) 子オブジェクトを取得する (マッピング) 方法はありますか。列名を使用したフェッチは機能し、対応するオブジェクト マッピングは必要ありませんが、子テーブルのすべての列をフェッチしたいので、SQL クエリで c.* を使用することをお勧めします。

4

1 に答える 1

0

ネイティブ クエリの代わりに通常の HQL クエリを使用します。HQL では、fetch join を使用できます。

"select p.*, c.* from parent p left join fetch child c on p.id = c.parent_id where p.property = <some_property>"

fetch join を使用すると、単一の選択を使用して、親オブジェクトとともにコレクションを初期化できます。

于 2013-03-15T18:42:30.887 に答える