我使用JPA和Hibernate 4.3.1作为JPA提供程序。我正在使用JPQL来编写查询。当我编写一个JPQL来从一个实体中获取值时,该实体具有一个引用另一个表的Map,它就失败了 以下是我的POJO:
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
}
我需要获取标题为特定值的所有书籍。一本书可以有多种语言的标题。因此,对于一个书籍ID,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)=:value反转为:值IN VALUE(m)。但是这对我不起作用,并且它表示意外的令牌(找到了。
有没有办法改变JPQL,以便我的HQL形成如下:我不想使用Criteria 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 :(得分:0)
反转VALUE和:值并添加括号应该有效。例如:
@Query("select t from Object t join t.names n where :name IN (VALUE(n.map))")