HQL-запрос с использованием JOIN возвращает неполные результаты
У меня есть 2 таблицы, "Книга" и "Автор", соединенные в связи "многие ко многим" с помощью таблицы BookHasAuthor. Таблица BookHasAuthor необходима, поскольку в самой взаимосвязи также есть некоторые другие данные. И Книга, и Автор имеют отношения, объявленные так:
// Book.java
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.book", cascade = CascadeType.ALL)
private Set<BookHasAuthor> authors = new HashSet<BookHasAuthor>(0);
Я хочу запросить определенную Книгу, например, по идентификатору, но получить все их отношения одновременно. Таким образом, я могу сериализовать полученный объект Book в JSON и вернуть его в Response после закрытия сеанса Hibernate.
Предположим, что в базе данных есть 2 книги с 3 авторами в каждой. Как только объект Query создан и параметры установлены, я вызываю list()
чтобы получить массив результатов. Проблема в том, что до сих пор мои попытки запроса вернули только 3 копии одной и той же Книги, каждая с массивом "авторы", содержащим одну запись, или один объект Книги только с одним из авторов. Хотя я не понимаю второго поведения, первое - это то, что я ожидал бы при использовании простого SQL, но главная причина, по которой я использую HQL, заключается именно в том, чтобы абстрагироваться от необходимости объединять все результаты. До сих пор я не нашел правильный способ запроса для одной Книги, чтобы получить всех ее Авторов в массиве.
Это запросы, которые я пробовал до сих пор:
SELECT item FROM Book item JOIN item.authors WHERE item.id = 1
Это возвращает 3 книги, каждая из которых имеет другого автора в массиве "авторы". Использование INNER, LEFT JOIN или JOIN FETCH не дало никаких изменений.
SELECT item FROM Book item WHERE item.id = 1
Это возвращает 1 книгу с массивом "авторы" только с 1 автором.
Я чувствую, что упускаю что-то действительно глупое здесь, но я не могу понять, что это такое. Любой совет?
РЕДАКТИРОВАТЬ: Просто чтобы уточнить, я создал новый проект, переделал все таким же образом, и получить результат, который я ожидал, поэтому, возможно, проблема, с которой я сталкиваюсь здесь, не имеет ничего общего с тем, что я думаю. Любые идеи о том, что может быть причиной этой проблемы, приветствуются.