我有一个复杂的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)
和其他许多人
有没有一种通用的方法来进行这种检查,使这个查询工作,而不建立查询?
2条答案
按热度按时间yizd12fk1#
你应该使用
Specification
,并使用JPA Criteria API有条件地将 predicate 添加到where子句中。这样,你的查询计划将比这个通用解决方案更好,此外它也不会使用意外工作的东西。请注意,这个查询SELECT t FROM table t where COALESCE(:codes) IS NULL OR t.code IN (:codes)
将不再适用于Hibernate 6。frebpwbc2#
不是最好的答案,但我在stackoverflow https://stackoverflow.com/a/54035166/5679560上找到了解决方案
解决方案是简单地使用COALESCE和IS NULL,这样它就可以处理多个值。