[英]Grails 2.x createCriteria 'or' doesn't work for nested associations
似乎在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,但现在似乎没有用 - 除了运行多个查询之外,有没有人知道这个的好方法?
更新:
Post Grails 2.x,Criteria默认使用inner
联接,但是对于这种特殊情况,必须使用outer
联接,因为如果是inner
联接并且乘客未设置为car,乘客协会将不允许跟随or
调整。
import org.hibernate.Criteria
def queryResults = Car.createCriteria().list() {
createAlias('passenger', 'passenger', Criteria.LEFT_JOIN)
or {
eq('isMoving', true)
eq('passenger.isDriving', true)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.