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

时间:2013-10-15 20:45:35

标签: grails gorm grails-2.0 createcriteria

似乎在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,但现在似乎没有用 - 除了运行多个查询之外,有没有人知道一个好的解决方法?

1 个答案:

答案 0 :(得分:11)

<强>更新
发布Grails 2.x,默认情况下,条件使用inner加入,但对于此特定情况,必须使用outer加入,因为如果是or条件,则旅客关联将不允许inner条件import org.hibernate.Criteria def queryResults = Car.createCriteria().list() { createAlias('passenger', 'passenger', Criteria.LEFT_JOIN) or { eq('isMoving', true) eq('passenger.isDriving', true) } } 加入并且乘客不会开车。

{{1}}