У меня есть ManagedList, который содержит список ListElement.Эти ListElement содержит список перевода.
public class ManagedList {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false, length = 50)
private String name;
@OneToMany(mappedBy = "managedList", fetch = FetchType.LAZY)
private List<ListElement> listElement;
}
public class ListElement {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name= "listElement_id")
private List<ElementTranslation> translations;
}
public class ElementTranslation {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private Language language;
@ManyToOne(fetch = FetchType.LAZY)
private ListElement listElement;
@Column(name = "text", nullable = true, length = 200)
private String text;
}
public class Language {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false, length = 50)
private String name;
}
Я хотел бы получить все ManagedList со всеми их элементами, но для каждого элемента мне нужен только 1 перевод (в зависимости от выбора локали)
Допустим, в БД у меня есть 2 ManagedList, у каждого есть 3 элемента, у каждого элемента есть 2 перевода.
С:
public List<ManagedList> findAllByOrderByNameAsc();
Я получил 2 результата, но я получил все переводы длякаждый элемент.
Я пытался с:
@Query("select managedList from ManagedList managedList "
+ "left join managedList.listElement as listElement "
+ "left join listElement.translations as translations "
+ "left join translations.language as language "
+ "where language.name = :locale ")
List<ManagedList> getVocab(@Param("locale") String locale);
Но я получил 6 результатов, и в любом случае все еще каждый перевод для каждого элемента.
Я хотел бы получить2 результата (ManagedList) с каждым из их элементов, и для каждого элемента я хотел бы только 1 перевод (один для языкового стандарта String).
Я пытался добавить «выборку» в JPQL, как
...
+ "left join fetch translations.language as language "
...
Но я получил следующую ошибку:
в запросе указано объединение выборки, но владелец извлеченной ассоциации не присутствовал в списке выбора
Любые советы о том, как этого добиться?Thx!