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)
         }
      }
    }