这就是我的情况,我有两个基本的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
有没有人知道用这种方法能不能得到我想要的东西?
发布于 2011-08-26 10:01:30
HHH-2831 Native SQL queries with addJoin or return object arrays instead of single Entities
这种行为是由一个已知的bug引起的。多,你应该更努力地搜索!
发布于 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)
对最后添加的实体执行操作。
发布于 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
组合。
https://stackoverflow.com/questions/7186806
复制相似问题