Spring Boot JPA的JPQL查询如何向IN子句传递整数列表参数
问题根源
当前写法失效的核心原因有两个:
- IN查询的参数定义为String类型,和数据库
facility_id字段的int类型不匹配,数据库无法完成隐式类型转换导致匹配失败 - JPQL的IN关键字原生支持集合类型参数,不需要手动将ID拼接为逗号分隔的字符串传入
正确修改方案
- 调整Repository方法的参数类型,将
listOfFacilityIds的类型从String改为对应整数类型的List:数据库字段是int就用List<Integer>,是bigint就用List<Long>,和字段类型保持一致 - 修正JPQL的字段写法:JPQL是基于实体类属性查询,不是直接写数据库列名,如果你的实体类中对应字段是驼峰命名(比如
private Integer facilityId),需要把语句里的下划线命名facility_id替换为实体的实际属性名,同时加上实体别名前缀避免歧义。如果使用低版本JPA,IN后的参数建议套一层括号保证兼容性。
修改后的最终代码:
@Query("select a from TableName a where a.dateOfContact BETWEEN :start AND :end AND a.facilityId IN (:listOfFacilityIds)") List<ModelName> findAllByFacilityAndDateCreated( @Param("listOfFacilityIds") List<Integer> listOfFacilityIds, @Param("start") LocalDate start, @Param("end") LocalDate end );
注:请根据你自己实体类的实际类名、属性名调整JPQL中的对应字段,比如实体类名是TableName就写TableName,联系日期属性是dateOfContact就写a.dateOfContact,不要直接照搬数据库的下划线命名。
使用注意事项
- 调用方法时直接传入组装好的整数集合即可,比如传入
Arrays.asList(1,2,5,7),不需要做任何字符串转义、拼接操作 - JPA会自动将集合参数展开为IN子句的多个预编译占位符,自动做类型匹配,不会产生SQL注入风险
- 若传入的ID列表为空,高版本Spring Data JPA会自动处理为返回空结果的逻辑,不会抛出SQL语法错误
内容的提问来源于stack exchange,提问作者Dikum
相关产品推荐
相关产品推荐

