Grails 2.x createCriteria 'или' не работает для вложенных ассоциаций
Похоже, что в Grails 2.x, если у вас есть ассоциация классов домена, и вы пытаетесь запустить createCriteria, используя or
на этом отношении + другой запрос, 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 ответ
ОБНОВИТЬ:
Post 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)
}
}