Логическое выражение для двух условий элемента списка

Я использую здесь QueryDSL для создания предиката, проблема в том, что для этого предиката требуется два условия И, и я застрял здесь, потому что не знаю, как я буду применять второе условие.

Это сценарий:

У меня есть оборудование, это оборудование лаборатории, а в лаборатории есть команда. Некоторые члены этой лабораторной группы могут регистрировать новое оборудование, а некоторые нет, это определяется логическим атрибутом «registerEquipment». Итак, у моего предиката должны быть следующие условия:

* Пользователь должен быть членом лабораторной группы и иметь для атрибута registerEquipment значение true, чтобы видеть это оборудование. Я пробовал следующий код:

BooleanExpression registerEquipmentAndTeamMember = QEquipment.equipment.laboratory.team.any().registerEquipment.and(QEquipment.equipment.laboratory.team.any().person.id.eq("AQ88"));

Но не работает, потому что сначала выполняет условие registerEquipment, а затем teamMember. Я хотел бы знать, как я могу выполнить оба условия для члена команды одновременно.


person Andre    schedule 28.08.2019    source источник
comment
На что вы надеетесь, если они будут выполняться одновременно / в чем проблема, если одна из частей выполняется первой?   -  person Marc Sloth Eastman    schedule 28.08.2019
comment
@MarcSlothEastman Выполняя оба условия одновременно, он правильно вернет мне людей, у которых есть значение registerEquipment true, и членов лабораторной группы. Если он выполняется отдельно, он вернет людей из лабораторной бригады и людей, которые не регистрируют оборудование. Это проблема...   -  person Andre    schedule 28.08.2019
comment
Как вы думаете, почему в этом проблема? Учитывая, что оба эти запроса являются запросами типа get / SELECT, они не будут влиять друг на друга. Я бы порекомендовал пробовать запросы отдельно и публиковать результаты здесь   -  person Marc Sloth Eastman    schedule 28.08.2019
comment
@MarcSlothEastman Потому что QueryDSL генерирует запрос с двумя существующими вместо одного. Например, вместо того, чтобы проверять, является ли текущий пользователь членом группы лаборатории и registerEquipment = true, QueryDSL проверяет, есть ли кто-то, у кого registerEquipment = true, а затем является ли текущий пользователь частью группы лаборатории. Правильным будет, если текущий пользователь является частью лабораторной группы и имеет значение registerEquipment = true.   -  person Andre    schedule 28.08.2019
comment
@MarcSlothEastman Точно так же, где существует (выберите 1 из equipment.laboratory.team как equipment_laboratory_team_0, где equipment_laboratory_team_0.registerEquipment и существует (выберите 1 из equipment.laboratory.team как equipment_laboratory_team_1, где equipment_laboratory_team_1.person.id =? 1))   -  person Andre    schedule 28.08.2019
comment
Запрос этого второго комментария, который вы опубликовали, просто проверяет, есть ли кто-то с этим идентификатором и кто-то с доступом к оборудованию, не обязательно одно и то же. Я бы рекомендовал не использовать .any()   -  person Marc Sloth Eastman    schedule 29.08.2019


Ответы (1)


Я понял. Мне пришлось использовать JPAExpression. Это правильный код:

QEquipment equipment = QEquipment.equipment;
QTeam team = QTeam.team;
QLaboratory laboratory = QLaboratory.laboratory;

Predicate predicate = JPAExpressions
       .selectOne()
       .from(team)
       .where(equipment.laboratory.id.eq(laboratory.id),
              laboratory.id.eq(team.laboratory.id),
              team.registerEquipment.eq(Boolean.TRUE),
              team.person.id.eq(userService.getCurrentId())).exists();

Теперь он будет одновременно фильтровать члена лаборатории, у которого есть разрешение на регистрацию оборудования.

person Andre    schedule 29.08.2019