【发布时间】:2014-10-24 06:53:17
【问题描述】:
我使用 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
}
我需要获取所有标题为特定值的书籍。一本书可以有多种语言的标题。因此,对于一个 Book 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 个标题,这很好用。但如果一本书有多个标题,则此操作将失败,因为子查询返回多于 1 行。
我尝试了StackOverflowQuestion 中的解决方案,它谈到了将 VALUE(m) = :value 反转为 :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 (?)
【问题讨论】: