表达式为空会在本地查询中引起异常

问题描述

我使用HibernateJpaRepository处理数据库操作。

我有这个查询(为了简化,因为原始查询很大):

@Query(value="select * from history h where h.project_id in :projects",nativeQuery=true)
List<History> getHistoriesByProjectsIn(@Param("projects")List<Long> projects);

,并且当我传递有效且不为空的List<Long>时,它正在工作。但是,当我传递可能会发生的空列表时,在我的情况下这并不罕见,我得到:

org.postgresql.util.PsqlException: ERROR: Syntax error at or near ")"

有人可以给我提示如何摆脱它吗?

解决方法

PostgreSQL文档statesin谓词不能保存空列表

expression IN (value [,...])

并且随着冬眠原样传递本地查询,可以预见这会导致问题。

但是,作为解决方法,您可以遵循this的建议:使用不可能的值初始化列表

编辑

实际上,此行为已在休眠5.4.10中更改。参见commit

SHA-1: ab9ae431858dc6727023d7f03bd6925f99011c62

* HHH-8901 replace "in ()" SQL with "in (null)" in QueryParameterBindingsImpl

对于您的情况,将生成以下sql:

select * from history h where h.project_id in (null)

任务HHH-8901的描述与这些更改完全无关。