似乎在 Grails 2.x 中,如果您有一个域类关联,并且您尝试使用以下命令运行 createCriteriaor
在该关系+另一个查询上,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 中可以工作,但现在似乎不起作用——除了运行多个查询之外,有谁知道一个好的解决方法吗?
UPDATE:
Grails 2.x 之后,默认使用 Criteriainner
加入,但对于这个特殊情况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)
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)