Grails Hibernate Criteria:如何为一个关联指定多个条件?

时间:2016-06-16 18:54:41

标签: hibernate grails gorm criteria detachedcriteria

编辑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天内已执行交易的所有帐户实例。

这一切都很棒,但我如何为关联做更复杂的查询?我的意思是,不是每次我都想说

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

而是

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

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

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"
)

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

1 个答案:

答案 0 :(得分:1)

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

你试过吗

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