繁体   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