JPA查询检查@Param set是否为空或null

y1aodyip  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(228)

我有一个复杂的HQL查询,我想运行。我的一个参数是一个Set<Integer>与有效值的结果
类似于:select * from table t where t.code IN (Set<Integer>)
这很简单吧?问题是我希望这个查询返回ALL ITEMS,如果Set<Integer>为空或null(不需要为空或null,处理任何一种情况就足够了)
考虑JPA存储库方法:

public Page<Table> findAll(@Param("codes") Set<Integer> codes);

我尝试了几种方法:

SELECT t FROM table t where :codes IS NULL OR t.code IN (:codes)

运行时错误:SQL Error: 1241, SQLState: 21000 (conn=3123) Operand should contain 1 column(s)

SELECT t FROM table t where (:codes) IS EMPTY OR t.code IN (:codes)

Spring甚至无法 Boot ??? is not mapped
SELECT t FROM table t where size((:codes))= 0 OR t.code IN(:codes)
和其他许多人
有没有一种通用的方法来进行这种检查,使这个查询工作,而不建立查询?

yizd12fk

yizd12fk1#

你应该使用Specification,并使用JPA Criteria API有条件地将 predicate 添加到where子句中。这样,你的查询计划将比这个通用解决方案更好,此外它也不会使用意外工作的东西。请注意,这个查询SELECT t FROM table t where COALESCE(:codes) IS NULL OR t.code IN (:codes)将不再适用于Hibernate 6。

frebpwbc

frebpwbc2#

不是最好的答案,但我在stackoverflow https://stackoverflow.com/a/54035166/5679560上找到了解决方案
解决方案是简单地使用COALESCE和IS NULL,这样它就可以处理多个值。

SELECT t FROM table t where COALESCE(:codes) IS NULL OR t.code IN (:codes)

相关问题