gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:56:06 26 4
gpt4 key购买 nike

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

Person
- PersonId
- Name
- Books

Book
- Code
- Description

My 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 对象,其中包含书籍集合中的书籍对象:

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

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

最佳答案

扩展马修斯的答案。要强制 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 即可获取和初始化关联的 Book 实体。

重复的

 .addEntity("p", Person.class)

是必要的,因为

 .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

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

关于java - Hibernate Native SQL 查询检索实体和集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7186806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com