【问题标题】:Hibernate: How to get result from query with multiple classesHibernate:如何从具有多个类的查询中获取结果
【发布时间】: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

【问题讨论】:

标签: java hibernate hql


【解决方案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];
             }
        

        【讨论】:

          猜你喜欢
          • 2021-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-29
          • 1970-01-01
          • 2013-10-20
          • 2022-09-30
          • 2023-03-23
          相关资源
          最近更新 更多