即时使用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)
答案 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
}
}