首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Hibernate Native SQL查询检索实体和集合

Hibernate Native SQL查询检索实体和集合
EN

Stack Overflow用户
提问于 2011-08-25 15:51:08
回答 5查看 51.5K关注 0票数 21

这就是我的情况,我有两个基本的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();

这是hibernate文档的18.1.3部分:http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querysql.html#d0e17464

我希望在我的列表中得到的是2个Person对象,其中包含图书集合中的book对象:

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

有没有人知道用这种方法能不能得到我想要的东西?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-26 10:01:30

HHH-2831 Native SQL queries with addJoin or return object arrays instead of single Entities

这种行为是由一个已知的bug引起的。多,你应该更努力地搜索!

票数 7
EN

Stack Overflow用户

发布于 2013-06-20 18:00:13

对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();

相关的图书实体将被获取和初始化,而不需要额外调用数据库。

复制品

 .addEntity("p", Person.class)

是必要的,因为

 .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

对最后添加的实体执行操作。

票数 38
EN

Stack Overflow用户

发布于 2011-08-25 19:40:36

下面的方法对我很有效:

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

这将返回一个包含Person列表的Object[],每个Book都包含一个SQL select列表。我认为你的问题是,你没有明确地给任何人指定别名。

EDIT:该方法返回一个Object[],但数组中填充了Person实例,并且仅填充了Person实例。

如果Hibernate不知道如何映射到您的类,或者如果它不知道如何映射连接,它将返回一个对象列表。确保每行上只有一个Person/Book组合。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7186806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档