【问题标题】:Grails Hibernate Criteria: How do I specify multiple criteria for one association?Grails Hibernate Criteria:如何为一个关联指定多个条件?
【发布时间】:2025-12-25 22:15:17
【问题描述】:

编辑 1:为了进一步澄清我的问题,我更新了我的示例代码,以便只有一个属性是相关的。

在 grails 文档中,在查询关联下给出了以下示例 in the Criteria section

我们可以通过使用属性名称事务作为构建器节点来查询 [...] 关联 [s]:

def c = Account.createCriteria()
def now = new Date()
def results = c.list {
    transactions {
        between('date', now - 10, now)
    }
}

上面的代码将找到在过去 10 天内执行过交易的所有 Account 实例 [...]。

这一切都很好,但我如何对关联进行更复杂的查询?我的意思是,不是每次我想说

查询至少有一个满足我条件的关联对象的所有域对象,

而是

查询至少有一个满足我的条件的关联对象并且至少有一个满足另一种条件的关联对象的所有域对象

这是我试图用来解决后一种情况的标准。它不起作用。

new DetachedCriteria(ParentDomainClass).build{
    associatedObjectsOfChildClass {
        eq 'someProp', 'value'
    }
    associatedObjectsOfChildClass {
        eq 'someProp', 'otherValue'
    }
}.list()

当我执行这段代码时,只考虑了一个关联标准。我认为同一个关联不允许有多个子查询。但如果是这样的话,我该如何进一步限制呢?

以下代码产生了预期的结果,但并未完全在数据库级别实现。

new DetachedCriteria(ParentDomainClass).build{
    associatedObjectsOfChildClass {
        eq 'someProp', 'value'
    }
}.list().intersect(new DetachedCriteria(ParentDomainClass).build{
    associatedObjectsOfChildClass {
        eq 'someProp', 'other_value'
}}.list())

这是原生 MySQL 中的一个解决方案:

select * from parent_object
where id in(
    select parent_id from child_object
    where some_prop = "value"
)
and id in (
    select parent_id from child_object
    where some_prop = "other_value"
)

如何仅使用标准来实现这一目标?

【问题讨论】:

    标签: hibernate grails grails-orm criteria detachedcriteria


    【解决方案1】:

    为此检查 sql 查询日志。您可以通过在 dataSource.groovy 中添加 logSql=true 来记录查询,或者在 Grails 3 的 yml 文件中设置此属性。

    你试过了吗

    Account.createCriteria().list{
        associatedObjectsOfChildClass {
            eq 'someProp', 'value'
            eq 'otherProp', 'otherValue'
        }
    }
    

    【讨论】:

    • 我已经启用了 SQL 日志记录。这并没有真正帮助我,因为我不知道什么条件查询会产生我想要的 SQL 查询。请查看我对Bhushan's answer 的评论,了解为什么您提供的这段代码对我没有帮助。
    最近更新 更多