Grails 2.x createCriteria'或'不适用于嵌套关联 [英] Grails 2.x createCriteria 'or' doesn't work for nested associations
问题描述
或
运行createCriteria,则或
将忽略另一个查询,并使用嵌套关联的结果。我知道这可能有点令人困惑,所以这里是一个例子: class Passenger {
Long id
Boolean isDriving
}
class Car {
Long id
Passenger passenger
Boolean isMoving
static constraints = {
乘客可空:true
}
}
:
class CarIntegrationTests {
@Test
void testCar(){
Passenger passenger1 =新乘客(isDriving:true)
passenger1.save()
汽车车1 =新车(乘客:乘客1,正在行驶:假)
汽车车2 =新车(isMoving: true)
car1.save()
car2.save()
$ b $ def queryResults = Car.createCriteria().list(){
或{
eq('isMoving',true)//这样做本身可以工作
passenger {//这本身可以工作
eq ('isDriving',true)
}
} //但OR'd,它只返回嵌套部分的结果
}
assertEquals 2,queryResults .size()//返回1
}
}
在旧版本的Grails中工作,但似乎现在不工作 - 有谁知道一个很好的解决方法,除了运行多个查询吗?
Post Grails 2.x,Criteria默认使用
inner
join ,但是对于这种特殊情况或
条件是内部
加入并且乘客未设置为汽车。 import org.hibernate.Criteria
$ b $ def queryResults = Car.createCriteria()。list(){
createAlias('passenger','passenger',Criteria.LEFT_JOIN)
或{
eq('isMoving',true)
eq('passenger.isDriving',true)
}
}
It seems that in Grails 2.x, if you have a domain class association, and you try to run a createCriteria using or
on that relation + another query, the or
will ignore the other query and just use the results of the nested association. I realize this may be a little confusing, so here is an example:
class Passenger {
Long id
Boolean isDriving
}
class Car {
Long id
Passenger passenger
Boolean isMoving
static constraints = {
passenger nullable: true
}
}
and a test:
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
}
}
This same code worked in older versions of Grails, but doesn't not seem to work now -- does anyone know of a good workaround to this, other than running multiple queries?
UPDATE:
Post Grails 2.x, Criteria by default uses inner
join, but for this particular case outer
join has to be used as passenger association will not allow to follow or
condition if it is an inner
join and passenger is not set to car.
import org.hibernate.Criteria
def queryResults = Car.createCriteria().list() {
createAlias('passenger', 'passenger', Criteria.LEFT_JOIN)
or {
eq('isMoving', true)
eq('passenger.isDriving', true)
}
}
这篇关于Grails 2.x createCriteria'或'不适用于嵌套关联的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!