JPA Hibernate JP的Value值为map <key,value =“”> - 子查询返回多行</key,>

时间:2014-08-30 12:07:17

标签: hibernate jpa jpql

我使用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 (?)

1 个答案:

答案 0 :(得分:0)

反转VALUE和:值并添加括号应该有效。例如:

@Query("select t from Object t join t.names n where :name IN (VALUE(n.map))")