簡體   English   中英

Hibernate Native SQL Query檢索實體和集合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM