21

これが私の状況です。単純な休止状態のマッピングを指定した 2 つの基本的な POJO があります。

Person
  - PersonId
  - Name
  - Books

Book
  - Code
  - Description

私のSQLクエリは、次のような行を返します:

PERSONID NAME       CODE DESCRIPTION
-------- ---------- ---- -----------
1        BEN        1234 BOOK 1
1        BEN        5678 BOOK 2
2        JOHN       9012 BOOK 3

私の休止状態のクエリは次のようになります:

session.createSQLQuery("select personid, name, code, description from person_books")  
       .addEntity("person", Person.class)
       .addJoin("book", "person.books")
       .list();

これはセクションごとです: 休止状態のドキュメントの 18.1.3: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querysql.html#d0e17464

私のリストに期待するのは、 book のコレクションに含まれる book オブジェクトを持つ 2 つの Person オブジェクトです。

List
 |- Ben
 |   |- Book 1
 |   '- Book 2
 '- John
     '- Book 3

私が実際に見ているのはこれです:

List
 |- Object[]
 |   |- Ben
 |   |   |- Book 1
 |   |   '- Book 2
 |   '- Book 1
 |- Object[]
 |   |- Ben
 |   |   |- Book 1
 |   |   '- Book 2
 |   '- Book 2
 '- Object[]
     |- John
     |   '- Book 3
     '- Book 3

この方法を使用して必要なものを取得できるかどうかは誰にもわかりませんか?

4

5 に答える 5

13

以下は私にとってはうまくいきます:

session.createSQLQuery("select p.*, b.* from person p, book b where <complicated join>").
.addEntity("person", Person.class).addJoin("book", "person.books").list();

Object[]これは、のリストを含む を返しますPerson。各リストには のリストが含まれますBook。これは、単一の SQL 選択で行われます。あなたの問題は、特に person を何にもエイリアスしていないことだと思います。

編集: メソッドは Object[] を返しますが、配列には Person インスタンスが入力され、Person インスタンスのみが入力されます。

Hibernate がクラスへのマッピング方法を理解できない場合、または結合のマッピング方法を理解できない場合、オブジェクトのリストを返します。各行にPerson/の組み合わせが 1 つだけあることを確認してください。Book

于 2011-08-25T11:40:36.377 に答える
7

HHH-2831 単一エンティティの代わりに addJoin または return オブジェクト配列を使用するネイティブ SQL クエリ

この動作は、既知のバグが原因です。いや、もっともっと探すべきだった!

于 2011-08-26T02:01:30.150 に答える
1

AFAIK、SQLクエリから「マージされた」エンティティを取り戻すことはできません。オブジェクト配列のみが返されます。この状況で私がしたことは、引数としてオブジェクトの配列をとる、マージされたエンティティの新しいコンストラクターを作成したことです。それから私はそれを手動で構築しました。

于 2011-08-26T02:21:07.473 に答える
1

person_books ではなく person テーブルにクエリを配置する必要がありますか?

session.createSQLQuery("select * from person")  
   .addEntity("person", Person.class)
   .addJoin("book", "person.books")
   .list();
于 2011-08-25T08:07:40.960 に答える