Предикат QueryDSL с операторами OR () AND () возвращает неверный результат - PullRequest
0 голосов
/ 25 февраля 2020

Я использую QueryDSL 4.2.1 в своем проекте Spring Boot для создания простого предиката на основе заданного UUID.

PostgreSQL таблица выглядит следующим образом:

+--------------------------------------+-----+---------+--------------------------------------+
|                  id                  | ... | id_base |              id_primal               |
+--------------------------------------+-----+---------+--------------------------------------+
| 10190454-8607-47ea-a970-679255daab05 | ... | null    | 817b9faa-c282-4f87-814e-ec12443e851c |
+--------------------------------------+-----+---------+--------------------------------------+

Код:

public static Predicate createPredicate(final UUID engineId) {
    return (QCar.car.base.isNull().and(QCar.car.primal.isNotNull()).and(QCar.car.primal.engine.id.eq(engineId)))
            .or(QCar.car.primal.isNull().and(QCar.car.base.isNotNull()).and(QCar.car.base.engine.id.eq(engineId)));
}

public long countPredicate() {
    // Identifier of engine connected with primal object mentioned in database
    final UUID engineId = UUID.fromString("5407fb9a-95e5-463d-9986-9b8e9a1d03b5");
    return repository.count(createPredicate(engineId));
}

Результат должен быть просто значением 1, но каждый раз равен 0. Если я выполняю только

QCar.car.base.isNull().and(QCar.car.primal.isNotNull()).and(QCar.car.primal.engine.id.eq(engineId))

, все работает нормально. Конечно, у меня будет больше рядов - некоторые с основанием, а некоторые с первичными, поэтому я должен взять оба отношения в беспокойство. Было бы одно или другое (одно со значением и другое равным нулю) - никогда не бывает одновременно.

Может кто-нибудь указать и указать, что я здесь не понимаю?

...