Hibernate:如何从具有多个类的查询中获取结果

Posted

技术标签:

【中文标题】Hibernate:如何从具有多个类的查询中获取结果【英文标题】:Hibernate: How to get result from query with multiple classes 【发布时间】:2011-12-16 07:36:39 【问题描述】:

如果我的查询包含一个类,例如:

query = session.createQuery("select u from User as u");
queryResult = query.list();

然后我对其进行迭代,其中queryResultUser 类的对象。

那么如何从包含多个类的查询中获取结果?例如:

select u, g from User as u, Group as g where u.groupId = g.groupId and g.groupId = 1

【问题讨论】:

最佳答案在这里***.com/questions/5435304/… 【参考方案1】:

我相信你可以使用元组来做到这一点,但更重要的是,如果你的 Group 和 User 是相关的,就像那个查询似乎建议 User 应该有一个 Group 字段(不要在你的 User 类中使用 groupId,hibernate 应该对此进行排序为您服务)。如果是这种情况,您可以使用 select u from User u join fetch u.group g where g.groupId = :id 简单地查询它(然后使用 query.setParameter(1, id); 设置 id。

该查询中的fetch 关键字使其成为一个急切加载,因此两个对象都将返回到休眠状态,休眠状态将返回用户对象给您。使用 user.getGroup() 访问 Group 对象。

【讨论】:

我认为这是正确的方法,但我遇到了一些解析器错误:期待“all”,找到“join”,期待“by”,找到“where” 我的错误是 join fetch 而不是 fetch join。现在更正它。【参考方案2】:
for (Object[] result : query.list()) 
    User user = (User) result[0];
    Group group = (Group) result[1];

【讨论】:

【参考方案3】:

当您选择单个实体时,query.list() 将返回包含您的实体的 ObjectList

当您选择多个实体时,query.list() 将返回 ListObject[]。数组的每个元素代表一个单独的实体。

在此处阅读更多信息:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-select

【讨论】:

【参考方案4】:

你也可以创建一个构造函数并返回一个对象:

假设 Family 类具有适当的构造函数 - 作为实际的类型安全 Java 对象:

select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr

或列表:

select new list(mother, offspr, mate.name)
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-select

【讨论】:

【参考方案5】:

如果将 query.list() 转换为 Object[] 不起作用。您可以先将其转换为一个对象,然后像这样将该对象转换为 Object[]

for (Object r: query.list()) 
        Object[] r1 = (Object[]) r;
        User user = (User) result[0];
        Group group = (Group) result[1];
     

【讨论】:

以上是关于Hibernate:如何从具有多个类的查询中获取结果的主要内容,如果未能解决你的问题,请参考以下文章

(java)如何将从数据库中查询出来的结果集转换为对应类的对象?可考虑hibernate。

具有多个 where 子句的选择查询在一个结果表中返回多个结果行?

Hibernate继承和具有相同类的多个表

如何使用具有多个连接的 SQL 查询并使用休眠计数

如何在 Hibernate 中左加入获取多个孩子?

如何从具有多个表的 IDataReader 中检索值