[英]Hibernate Native SQL Query retrieving entities and collections
這是我的情況,我有兩個基本的POJO,我已經給出了一個簡單的hibernate映射:
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
我的hibernate查詢如下所示:
session.createSQLQuery("select personid, name, code, description from person_books")
.addEntity("person", Person.class)
.addJoin("book", "person.books")
.list();
這是每節:18.1.3的hibernate文檔: http : //docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querysql.html#d0e17464
我期望在我的列表中得到的是2個人物對象,其中包含書籍集合中的書籍對象:
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
有誰知道使用這種方法是否有可能獲得我想要的東西?
擴展Mathews的答案。 強制hibernate只返回一個人列表:
List<Person> peopleWithBooks = session.createSQLQuery(
"select {p.*}, {b.*} from person p, book b where <complicated join>").
.addEntity("p", Person.class)
.addJoin("b", "p.books")
.addEntity("p", Person.class)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.list();
將無需額外調用db即可獲取和初始化關聯工作簿實體。
重復
.addEntity("p", Person.class)
是必要的,因為
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
對最后添加的實體進行操作。
以下適用於我:
session.createSQLQuery("select p.*, b.* from person p, book b where <complicated join>").
.addEntity("person", Person.class).addJoin("book", "person.books").list();
這將返回一個包含Person
列表的Object[]
,每個Person
都包含Book
的列表。 它在單個SQL選擇中執行此操作。 我認為你的問題在於你並沒有特別地將人稱為別人。
編輯:該方法返回一個Object [],但該數組填充了Person實例,並且只填充了Person實例。
如果Hibernate不了解如何映射到您的類,或者它無法理解如何映射連接,它將返回一個對象列表。 確保每行只有一個Person
/ Book
組合。
HHH-2831使用addJoin或返回對象數組而不是單個實體的本機SQL查詢
此行為是由已知錯誤引起的。 Doh,應該更加努力!
您的查詢應該在person表而不是person_books嗎?
session.createSQLQuery("select * from person")
.addEntity("person", Person.class)
.addJoin("book", "person.books")
.list();
AFAIK,無法從SQL查詢中獲取“合並”實體。 您將只返回一個對象數組。 我在這種情況下做的是我為我的合並實體創建了一個新的構造函數,它接受了一個對象數組作為它的參數。 然后我手動構建了它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.