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.* を使用することをお勧めします。