Используйте JPQL, чтобы присоединиться к критериям - PullRequest
0 голосов
/ 03 июня 2019

Я использую JPA для возврата набора результатов, однако хочу исключить инструкции (которые объединяются в группы, а затем в формы), где удалено = true.

Я бы использовал предложение ON в именованном запросе, но оно вызывает исключение гибернации, потому что оно не поддерживается в версии, которую мы используем (обновление в настоящее время не вариант). Кроме того, версия JPA также не позволяет делать это через построитель критериев.

@NamedQuery(name = "Form.findAllForms", query="SELECT DISTINCT f FROM Form f LEFT OUTER JOIN f.instructionGroups g LEFT OUTER JOIN g.instructions i")
// .. ON i.deleted = false
public class Form implements Serializable {

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    @JoinColumn(name = "form_id", nullable = false)
    @OrderColumn(name = "sortOrder")
    private List<InstructionGroup> instructionGroups = new ArrayList<>();



public class InstructionGroup implements Serializable {

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    @JoinColumn(name = "instructionGroup_id", nullable = false)
    @OrderColumn(name = "sortOrder")
    private List<Instruction> instructions =  new ArrayList<>();



public class Instruction implements Serializable {

    private boolean deleted;

Использование предложения WHERE также не работает, поскольку оно больше не возвращает формы с прикрепленными удаленными инструкциями, где мне нужно применить свое условие на этапе соединения. Мой лучший вариант - написать собственный SQL и использовать его, или я могу придерживаться JPA для достижения этой цели?

1 Ответ

0 голосов
/ 03 июня 2019

Используйте условие «WITH» в запросе, чтобы указать условие при соединении. Обратитесь ниже запрос

query = "ВЫБЕРИТЕ ОТЛИЧИЕ f ОТ ФОРМЫ f ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ f.instructionGroups g ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ g.instructions i WITH i.deleted = 0

...