Grails executeQuery子查询

时间:2017-05-22 03:48:51

标签: grails groovy

即时使用grails 2.4.5

我想根据他们有多少合同来检索前三名客户

我试图执行此代码

def customers = Customer.executeQuery("Select cu, (Select count(*) from Contract co where co = cu.contract) from Customer cu",
                                            [max: 3])

并返回此错误

二进制逻辑运算符的左右两边是不兼容的[com.cms.Contract:java.util.Set(com.cms.Customer.contract)]

据我所知,co和cu.contract类型不一样,但我不明白为什么。谁可以帮助我如何执行grails的执行。这是我使用的唯一具有静态查询执行但仍需要遵循某种格式的框架。

我真正想做的是生成像这样的查询

Select * from Customer cu order by (Select count(*) from Contract co where co.id = cu.id)

1 个答案:

答案 0 :(得分:1)

您可以使用投影尝试Criteria查询:

def results = Customer.createCriteria().list() {
    createAlias( 'contracts', 'contractalias' )
    projections {
        groupProperty( 'contractalias.contract' )
        count( 'contractalias.contract', 'contractCount' )
    }
    maxResults( 3 )
    order 'contractCount', 'desc'
}

我不是100%的字段名称,因此必须在上述查询中假设。

在尝试这些查询时启用sql日志记录通常很有用,例如将以下内容添加到开发DataSource

 development {
     dataSource {
     ...
     logSql = true
    }
}