Я использую 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 для достижения этой цели?