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();
然后我对其进行迭代,其中queryResult
是User
类的对象。
那么如何从包含多个类的查询中获取结果?例如:
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()
将返回包含您的实体的 Object
的 List
。
当您选择多个实体时,query.list()
将返回 List
的 Object[]
。数组的每个元素代表一个单独的实体。
在此处阅读更多信息: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。