You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot JPA的JPQL查询如何向IN子句传递整数列表参数

问题根源

当前写法失效的核心原因有两个:

  • IN查询的参数定义为String类型,和数据库facility_id字段的int类型不匹配,数据库无法完成隐式类型转换导致匹配失败
  • JPQL的IN关键字原生支持集合类型参数,不需要手动将ID拼接为逗号分隔的字符串传入
正确修改方案
  1. 调整Repository方法的参数类型,将listOfFacilityIds的类型从String改为对应整数类型的List:数据库字段是int就用List<Integer>,是bigint就用List<Long>,和字段类型保持一致
  2. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:27:22