当前位置: 首页 > 知识库问答 >
问题:

JPA查询:检查@Param set是空的还是空的

宋育
2023-03-14

我想运行一个复杂的HQL查询。我的一个参数是< code >集合

类似:从表t中选择*,其中t.codeIN(Set

这很简单,对吗?问题是,我希望这个查询返回所有项目,例如< code >集

考虑 JPA 存储库方法:

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

我尝试了几种方法:

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

运行时错误:< code>SQL错误:1241,SQLState: 21000 (conn=3123)操作数应该包含1列

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

spring甚至不能启动< code >???未映射

从表t中选择t,其中size((:codes)) = 0或t.code IN (:codes)

和许多其他人

是否有一种通用方法可以进行此检查并使此查询在不完全构建查询的情况下工作?

共有2个答案

韦睿
2023-03-14

不是最好的答案,但我在堆栈溢出 https://stackoverflow.com/a/54035166/5679560

解决方案只是在IS NULL之外使用COALESCE,以便它可以处理多个值。

SELECT t FROM table t where COALESCE(:codes) IS NULL OR t.code IN (:codes)
充运浩
2023-03-14

相反,您应该使用< code >规范,并使用JPA Criteria API有条件地向where子句添加谓词。这样,您的查询计划将比这种通用解决方案更好,此外,它也不会使用意外工作的东西。注意,这个查询< code > SELECT t FROM table t where COALESCE(:codes)为空,或者(:codes)中的t.code在Hibernate 6中不再有效。

 类似资料: