JPQL:如何使用 where 子句实现与集合成员声明相同的功能?

Posted

技术标签:

【中文标题】JPQL:如何使用 where 子句实现与集合成员声明相同的功能?【英文标题】:JPQL: How to achieve the same functionality as collection member declaration with a where clause? 【发布时间】:2016-03-02 06:32:00 【问题描述】:

我的实体类是这样的:

@Entity
public class Book 
    ...
    @ElementCollection
    private List<String> authors;
    ...

现在我想通过输入作者姓名来查询书籍,例如Tom,但忽略名称的大小写,因此 tom/tOm/... 也应该匹配。我知道我可以使用集合成员声明来实现:

select b from Book b, in(b.authors) a where lower(a) = 'tom'

但是,在我们的应用程序框架中,所有 JPQL 语句都是从固定模板生成的:

select b from Book b where WHERE_CLAUSE

我只能提供 where 子句。有人知道如何使用此模板获得与上述相同的结果吗?

【问题讨论】:

更改(或放弃)框架。这是非常有限的。无法使用连接使其无法满足您需要执行的 95% 的查询。 我也想这样做,但是框架生成的语句已经太多了,所以改变它是很冒险的。 【参考方案1】:

终于找到了作弊方式:

select b from Book b where (b.id in (select bb from Book bb, in(bb.authors) a where lower(a) = 'tom'))

【讨论】:

以上是关于JPQL:如何使用 where 子句实现与集合成员声明相同的功能?的主要内容,如果未能解决你的问题,请参考以下文章

Spring JPA Hibernate JPQL 查找在 where 子句中传递的项目的索引

JPQL IN 子句:Java 数组(或列表、集合...)?

如何在 JPQL 中正确执行 LIKE 和 CASE 子句

JPA JPQL IN 子句:如何在 JPA 中使用 IN 子句?

JPA JPQL IN子句:如何在JPA中使用IN子句?

Doctrine 2 WHERE IN 子句使用实体集合