【问题标题】:JPA Hibernate JPQL VALUE of Map<key, value> - Subquery returns more than 1 rowJPA Hibernate JPQL VALUE of Map<key, value> - 子查询返回多于 1 行
【发布时间】: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 (?)

【问题讨论】:

    标签: hibernate jpa jpql


    【解决方案1】:

    反转 VALUE 和 :value 并添加括号应该可以。例如:

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

    【讨论】:

      猜你喜欢
      • 2014-02-11
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 2019-08-08
      相关资源
      最近更新 更多