Hibernate Grails createCriteria在hasMany上按条件排序
我尝试按hasMany的特定条目对createCriteria查询排序。我的域名看起来像:Hibernate Grails createCriteria在hasMany上按条件排序,hibernate,sorting,grails,criteria,Hibernate,Sorting,Grails,Criteria,我尝试按hasMany的特定条目对createCriteria查询排序。我的域名看起来像: class Asset { String name static hasMany = [ supporters: SupportRole ] } class SupportRole { Asset asset Person person String role } class Person { String name } 我要做的是按照Person类对资产的查询
class Asset {
String name
static hasMany = [
supporters: SupportRole
]
}
class SupportRole {
Asset asset
Person person
String role
}
class Person {
String name
}
我要做的是按照Person类对资产的查询排序,其中role='Primary'。如何基于条件进行连接?我提出了以下查询,但它无法正常工作:
assets = Asset.createCriteria.list() {
supporters {
like('role', 'Primary')
person {
order('name', sortOrder)
}
}
}
但是这个查询没有识别联接表的“role”属性,它只是消除了没有“Primary”SupportRole的资产。我需要它能够处理空值(例如,给定资产没有“主要”SupportRole)
万分感谢 标准可以很容易地转换为HQL,如下所示,其中不必处理投影和别名
def assets = Asset.executeQuery("select a from Asset as a \
inner join a.supporters as s \
inner join s.person as p \
where s.role = 'Primary' \
order by p.name = :sortOrder",
[sortOrder: 'desc'])
在这些情况下使用hql是很好的,但是如果您仍然想坚持使用条件,那么您应该在查询中显式地定义null条件。现在我们省略“orderby”,查询应该是这样的:
assets = Asset.createCriteria.list() {
or{
supporters {
like('role', 'Primary')
}
isEmpty("supporters")
}
}
谢谢你的帮助。然而,这是一个更大的查询的一部分,该查询基于一个变量进行排序(使用jqGrid)。我仍然需要使用变量使用能力的标准。有没有办法将此HQL嵌入到标准中?标准在运行时会转换为HQL,然后执行。当您说“将HQL嵌入Critera”时,它没有意义。更大的查询也可以用HQL编写,在使用关联的地方使用更多的内部联接。如果您想深入了解HQL,请访问并查看@user1505503您仍然可以通过executeQuery传递变量。例如,如果jqGrid正在发送订单,只需将其替换为“desc”