-1

私は mysql でこのクエリを使用します (tbl1 内のすべてのレコードには、tbl2 内のレコードのリストがあります)。

select tbl1.id, tbl2.id from parenttable1 tbl1 join childtable2 tbl2 on tbl1.id = tbl2.tbl1Id

結果は true ですが、これをアプリケーション内でネイティブ クエリ (javax.persistence.EntityManager#createNativeQuery()) として使用すると、tbl2.id が繰り返されます。何が問題ですか?

結果は次のようになります。

id   id
11   1
11   1
22   3
33   4
44   5
44   5
44   5

しかし、私は期待しています:

id   id
11   1
11   2
22   3
33   4
44   5
44   6
44   7

私のコードは次のようなものです:

List<MyDTO> foundList = (List<MyDTO>) entityManager.createNativeQuery("the query above", MyDTO.class).getResultList();

4

2 に答える 2

2

これらの2つの列をどのようにマップする必要があるかがわからない場合、JPAが同じ名前の2つの列を返すクエリの結果をDTOにマップする方法がわかりません。そして、DTO がどのように見えるかさえ示していません。

次のコードを実行すると、すべてうまくいくはずです。

List<Object[]> list = (List<Object[]>) em.createNativeQuery(sql).getResultList();
List<MyDTO> result = new ArrayList<MyDTO>(list.size());
for (Object[] row : list) {
    result.add(new MyDTO((Long) row[0], (Long) row[1]));
}

次回、自分のコードを見せるように求められたときは、それが完璧だとか明らかだとか、バグはどこか別の場所にあると考えるのではなく、それを実行してください。99.999% の確率で、バグはコードにあり、何百万人もの開発者が使用およびテストしいるライブラリのコードにはありません。

于 2012-12-08T11:51:28.063 に答える
0

たくさんのインスピレーションをありがとう。問題は、(DTO 内の) 子テーブルの id フィールドではなく、親テーブルの id フィールドに @Id が存在することでした!

于 2012-12-09T11:11:59.673 に答える