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


似乎

在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 中有效,但现在似乎不起作用——除了运行多个查询之外,有谁知道一个很好的解决方法?

更新:
在Grails 2.x之后,默认情况下,标准使用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)
    }
}

相关内容

  • 没有找到相关文章

最新更新