休眠本机 SQL 查询检索实体和集合

2022-09-02 02:27:34

这是我的情况,我有两个基本的POJO,我给了一个简单的冬眠映射:

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

我的休眠查询如下所示:

session.createSQLQuery("select personid, name, code, description from person_books")  
       .addEntity("person", Person.class)
       .addJoin("book", "person.books")
       .list();

这是每个部分:休眠文档的18.1.3: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

有谁知道是否可以使用此方法获得我想要的东西?


答案 1

扩展马修斯的答案。要强制休眠以仅返回人员列表,请执行以下操作:

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

关联的 Book 实体将被提取和初始化,而无需对 db 进行额外调用。

副本

 .addEntity("p", Person.class)

是必要的,因为

 .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

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


答案 2

以下内容对我有用:

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

这将返回一个包含 的列表,每个列表都包含一个 列表。它在单个 SQL 选择中执行此操作。我认为你的问题是你没有特别给任何人起别名。Object[]PersonBook

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

如果 Hibernate 不了解如何映射到您的类,或者如果它无法理解如何映射联接,它将返回对象列表。确保每行只有一个/组合。PersonBook


推荐