Grails - HQL 到 CriteriaBuilder
Grails - HQL to CriteriaBuilder
我一直在努力理解如何使用标准构建器。在非常简单的场景中,它们是直截了当的。但是下面的HQL怎么表达呢?
def pkg_query = "select p from Package as p join p.orgs as orgRole where p.packageScope=(:scope) and orgRole.roleType=(:roleType) and orgRole.org=(:provider)"
查询的第一部分很简单,但是我如何访问列表?
Package master = c.get {
and {
eq("packageScope",getMasterScope())
//imaginary code, 'and' would probably break it as only 1 match in list
for(orgRole in orgs){
and{
eq(orRole.org,provider)
eq(orgRole.roleType,getCPRole())
}
}
}
}
您可以针对关联(无论其基数如何)对标准进行建模,方法是将它们作为一种方法进行调用,该方法接收内部包含标准的闭包。对于您发布的查询,它是:
Package.createCriteria().get {
eq('packageScope', scope)
orgs {
and {
eq('roleType', roleType)
eq('org', provider)
}
}
}
您可以使用以下代码获取对象列表。
def listOfPackage = Package.createCriteria().list {
eq('packageScope', scope)
orgs {
and {
eq('roleType', roleType)
eq('org', provider)
}
}
}
我一直在努力理解如何使用标准构建器。在非常简单的场景中,它们是直截了当的。但是下面的HQL怎么表达呢?
def pkg_query = "select p from Package as p join p.orgs as orgRole where p.packageScope=(:scope) and orgRole.roleType=(:roleType) and orgRole.org=(:provider)"
查询的第一部分很简单,但是我如何访问列表?
Package master = c.get {
and {
eq("packageScope",getMasterScope())
//imaginary code, 'and' would probably break it as only 1 match in list
for(orgRole in orgs){
and{
eq(orRole.org,provider)
eq(orgRole.roleType,getCPRole())
}
}
}
}
您可以针对关联(无论其基数如何)对标准进行建模,方法是将它们作为一种方法进行调用,该方法接收内部包含标准的闭包。对于您发布的查询,它是:
Package.createCriteria().get {
eq('packageScope', scope)
orgs {
and {
eq('roleType', roleType)
eq('org', provider)
}
}
}
您可以使用以下代码获取对象列表。
def listOfPackage = Package.createCriteria().list {
eq('packageScope', scope)
orgs {
and {
eq('roleType', roleType)
eq('org', provider)
}
}
}