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 数组(或列表、集合...)?