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)
    }
}
Другие вопросы по тегам