Я использую JPA и Hibernate 4.3.1 в качестве поставщика JPA. Я использую JPQL для написания своих запросов. Когда я пишу JPQL для извлечения значений из сущности, которая имеет карту, ссылающуюся на другую таблицу, она терпит неудачу.
Ниже мой POJO:JPA Hibernate JPQL VALUE of map <key, value> - Подзапрос возвращает более 1 строки
public class Book {
@Id
@Column(name="ID", updatable=false, unique=true)
private String id;
@ElementCollection
@MapKeyColumn(name="language")
@Column(name="text")
@CollectionTable(name = "BOOK_TITLES")
private Map<String, String> title = Collections.emptyMap();
// other fields
}
Мне нужно получить все книги, название которой является конкретным значением. Книга может иметь название на нескольких языках. Следовательно, для одного идентификатора книги в таблице BOOK_TITLES может быть несколько записей. Ниже JPQL:
SELECT b FROM Book b WHERE value(b.t) IN :title
Но HQL, который получает формируется за это приводит к подзапрос, возвращающий более чем на 1 строку:
select book0_.ID as ID1_0_, ...<other fields>
from my_library.BOOKS book0_ cross join my_library.BOOK_TITLES title1_
where book0_.ID=title1_.Book_ID
and ((select title1_.TEXT from my_library.BOOK_TITLES title1_
where book0_.ID=title1_.Book_ID) in (?))
Это прекрасно работает, если есть только один заголовок для книги. Но если для одной книги больше заголовков, то это терпит неудачу, потому что подзапрос возвращает более 1 строки.
Я попробовал решение в StackOverflowQuestion, в котором говорилось об изменении значения VALUE (m) =: значение: значение IN VALUE (м). Но это не работает для меня, и это говорит неожиданный маркер (найден
Есть ли способ, чтобы изменить JPQL такое, что мой HQL получает формируется, как показано ниже:.. Я не хочу использовать критерии Builder
select book0_.ID as ID1_0_, ...<other fields>
from my_library.BOOKS book0_ cross join my_library.BOOK_TITLES title1_
where book0_.ID=title1_.Book_ID and title1_.TEXT IN (?)