grails - Grails executeQuery子查询

标签 grails groovy

即时通讯使用grails 2.4.5

我想根据他们有多少契约(Contract)来检索前三名客户

我试图执行此代码

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的executeQuery如何工作。这是我使用的唯一具有静态查询执行但仍需要遵循某种格式的框架。

我真正想做的是生成这样的查询
Select * from Customer cu order by (Select count(*) from Contract co where co.id = cu.id)

最佳答案

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

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

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

尝试这些查询时打开sql日志记录通常非常有用,例如在开发数据源中添加以下内容
 development {
     dataSource {
     ...
     logSql = true
    }
}

关于grails - Grails executeQuery子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44104369/

相关文章:

dynamic - 每个对象的 Groovy 动态属性

grails - 如何防止Grails在删除父级时不删除子级?

grails - 删除后 quartz 作业仍然存在吗?

grails - 验证后对象没有持久化,没有错误

jquery - 卡塔隆 : Unable to click on object: Web element with id not found

java - Gradle 'exclude' 本地 `fileTree` 来自子项目的传递依赖

bash - 如何从 Jenkins 管道 Groovy 脚本调用资源文件中定义的 bash 函数?

grails 在没有数据库支持的情况下从 bootstrap.groovy 填充 Controller 模型

grails - 是否有将 Grails 3.1.x 应用程序升级到最新 3.1 版本的脚本?

maven - Grails 无法启动,卡在 postProcessBeanFactory