2014-08-30 1 views
2

Я использую 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 (?) 

ответ

0

Инвертирование VALUE и: значение и добавление скобок должны работать. Пример:

@Query("select t from Object t join t.names n where :name IN (VALUE(n.map))") 
Смежные вопросы