Grails 3 - 从 HQL 查询的查询结果中返回列表

标签 grails hql grails-orm grails-3.0

我有一个域对象:

class Business {
    String name
    List subUnits

    static hasMany = [
            subUnits : SubUnit,
    ]
}

我想使用 HQL 获取名称和子单元,但出现错误
Exception: org.springframework.orm.hibernate4.HibernateQueryException: not an entity

使用时:
List businesses = Business.executeQuery("select business.name, business.subUnits from Business as business")

有没有办法可以使用 HQL 将结果查询结果中返回的子单元作为列表返回?当我使用左连接时,查询结果是一个重复名称的扁平列表。实际查询更复杂——这是一个简化版本,所以我不能只使用 Business.list()。

最佳答案

我想我应该添加它作为答案,因为我一直在做这种事情,并且我可以与他人分享很多知识:

根据上述 Yariash 的建议:

这是通过域对象向前走,而不是将信息作为平面列表( map )抓取。当拥有一个完整的对象然后要求它循环并返回许多关系而不是把它全部放在一个包含的列表中时,会涉及到费用

@anonymous1 听起来正确的左连接 - 您可以查看添加到查询末尾的“按名称分组”。或者,当您获得所有结果时,您可以使用businesss.groupBy{it.name}(这是一个很酷的常规功能}查看groupBy的输出以了解它对

但是,如果您尝试抓取整个对象并将其映射回来,那么实际上成本仍然非常高,并且可能与 Yariash 的建议一样昂贵,甚至可能更糟。

List businesses = Business.executeQuery("select new map(business.name as name, su.field1 as field1, su.field2 as field2) from Business b left join b.subUnits su ")

以上确实是您应该尝试做的事情,左加入然后捕获 hasMany 的每个内部元素作为您在该列表中返回的所有 map 的一部分。

那么当你得到你的结果时

def groupedBusinesses=businesses.groupBy{it.name} 其中 name 是具有 hasMany 关系的主类中的主要对象。

如果你再看看你会看到每个名字都有自己的列表
groupedBusinesses: [name1: [ [field1,field2,field3], [field1,field2,field3] ]

你现在可以做
groupedBusinesses.get(name) to get entire list for that hasMany relation.

为上述 hql 查询启用 SQL 日志记录,然后将其与
List businesses = Business.executeQuery("select new map(b.name as name, su as subUnits) from Business b left join b.subUnits su ")

您将看到第二个查询将生成巨大的 SQL 查询来获取数据,因为它试图映射每行的整个条目。

我已经测试了这个理论,与第一个示例创建的几行查询相比,如果不是从 HQL 中创建的多页 SQL 查询,它总是倾向于围绕一个充满查询的整个页面。

关于Grails 3 - 从 HQL 查询的查询结果中返回列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38363404/

相关文章:

grails - 如果从Eclipse(STS)运行,则测试成功,但如果从带有ClassNotFoundException的grails运行,则测试将失败

mysql - Grails 实体更改我的表并创建新表

用于批量插入的 Grails 3.0 propertyInstanceMap

grails - 在 Grails 2.3.8 中测试 .gsp 页面的渲染内容

mysql - Grails 属性不能为 null 错误

hibernate - Grails 1.1 应用程序的集成测试在 Grails 2.0.3 中不起作用。会不会是 GORM 配置问题?

grails - Grails中的executeUpdate

Hibernate如何使用order by子句按字段总和排序

mysql - Hibernate HQL - 从今天开始获取下一个日期的实体

Grails 命名查询不适用于 "in"语句