【问题标题】:Grails - HQL to CriteriaBuilderGrails - HQL 到 CriteriaBuilder
【发布时间】:2015-08-04 09:16:15
【问题描述】:

我一直在努力理解如何使用标准构建器。在非常简单的场景中,它们是直截了当的。但是下面的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())
            }
        }
    }
  }

【问题讨论】:

    标签: grails groovy hibernate-criteria


    【解决方案1】:

    您可以根据关联(无论其基数如何)对标准进行建模,方法是调用它们作为接收带有标准的闭包的方法。对于您发布的查询,它将是:

    Package.createCriteria().get {
      eq('packageScope', scope)
      orgs {
         and {
            eq('roleType', roleType)
            eq('org', provider)
         }
      }
    }
    

    【讨论】:

    • 如果您使用的是 MySQL,我真的建议您激活查询日志并检查生成的 SQL,然后您可以更多地使用条件和 HQL,并比较它们的实际查询,确保您正在实现您真正想要的查询 - 请参阅 stackoverflow.com/questions/6479107/… 。我确信其他数据存储也有类似的选项。
    【解决方案2】:

    您可以使用以下代码获取对象列表。

    def listOfPackage = Package.createCriteria().list {
          eq('packageScope', scope)
          orgs {
             and {
                eq('roleType', roleType)
                eq('org', provider)
             }
          }
        }
    

    【讨论】:

      猜你喜欢
      • 2014-12-15
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多