Grails 2.x createCriteria 'or' 不适用于嵌套关联

Posted

技术标签:

【中文标题】Grails 2.x createCriteria \'or\' 不适用于嵌套关联【英文标题】:Grails 2.x createCriteria 'or' doesn't work for nested associationsGrails 2.x createCriteria 'or' 不适用于嵌套关联 【发布时间】:2013-10-23 19:38:00 【问题描述】:

似乎在 Grails 2.x 中,如果您有一个域类关联,并且您尝试在该关系 + 另一个查询上使用 or 运行 createCriteria,or 将忽略另一个查询并只使用嵌套关联的结果。我意识到这可能有点令人困惑,所以这里有一个例子:

class Passenger 
    Long id
    Boolean isDriving


class Car 
    Long id
    Passenger passenger
    Boolean isMoving

    static constraints = 
        passenger nullable: true
    

还有一个测试:

class CarIntegrationTests 
    @Test
    void testCar() 
    Passenger passenger1 = new Passenger(isDriving: true)
    passenger1.save()

    Car car1 = new Car(passenger: passenger1, isMoving: false)
    Car car2 = new Car(isMoving: true)

    car1.save()
    car2.save()

        def queryResults = Car.createCriteria().list() 
            or 
                eq('isMoving', true)// This by itself works

                passenger // And this by itself works
                    eq('isDriving', true)
                
            // But OR'd, it only returns the results of the nested part
        

        assertEquals 2, queryResults.size() // Returns 1
    

同样的代码在旧版本的 Grails 中工作,但现在似乎不能工作——除了运行多个查询之外,有没有人知道一个好的解决方法?

【问题讨论】:

尝试开启休眠日志,看看生成了什么sql。作为一种解决方法,您可以只编写一个 hql 查询,但您不必这样做 @JimSosa 是的,我会尝试使用日志记录。我希望不要使用 HQL,但是是的,我可能不得不这样做。 【参考方案1】:

更新: 在 Grails 2.x 之后,Criteria 默认使用 inner 加入,但对于这种特殊情况,outer 加入必须用作乘客关联,如果它是 inner 加入和乘客,则不允许遵循 or 条件未设置为汽车。

import org.hibernate.Criteria

def queryResults = Car.createCriteria().list() 
    createAlias('passenger', 'passenger', Criteria.LEFT_JOIN)
    or 
        eq('isMoving', true)
        eq('passenger.isDriving', true)
    

【讨论】:

@GrailsGuy 查看我的更新。必须使用外连接。 注意 grails 3/hibernate 4+,Criteria 已弃用,应改为 JoinType.LEFT_OUTER_JOIN,但除此之外仍然是一个完美的答案。

以上是关于Grails 2.x createCriteria 'or' 不适用于嵌套关联的主要内容,如果未能解决你的问题,请参考以下文章

使用 createCriteria 的 Grails 子查询

引起:java.lang.NoSuchMethodError: createCriteria grails

Grails createCriteria:通过作为空域类实例的字段查找对象

Grails的CreateCriteria逻辑性和OR性都不正常。

优化 Grails 查询

grails查询指定列