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

如何在Spring Data JPA方法的IN子句中传入List<自定义对象>作为参数

如何在Spring Data JPA方法的IN子句中传入List<自定义对象>作为参数

嘿,我完全懂你的需求——之前只会用单个字段的IN查询,现在要同时匹配name和date两个字段的组合,还想用自定义的Demo对象列表当参数对吧?下面给你几种实用的方案,都是Spring Data JPA里常用的实现方式:

方案1:用@Query写JPQL行值表达式查询

这是最直观的方式,适合支持行值表达式的数据库(比如MySQL 8.0+、PostgreSQL、Oracle等)。我们直接在JPQL里把目标实体的name和date组合,和传入的Demo列表里的属性做匹配。

首先确保你的Demo类(可以是DTO或者实体)有对应的name和date属性及getter:

// 如果你只是用它当参数DTO,不需要加@Entity注解
public class Demo {
    private String name;
    private Date date;

    // 构造函数、getter、setter一定要有,JPQL会通过getter读取属性值
    public Demo(String name, Date date) {
        this.name = name;
        this.date = date;
    }

    // getter方法
    public String getName() { return name; }
    public Date getDate() { return date; }
}

然后在你的Repository接口里定义查询方法:

public interface YourEntityRepository extends JpaRepository<YourEntity, Long> {

    @Query("SELECT e FROM YourEntity e WHERE (e.name, e.date) IN :demoList")
    List<YourEntity> findByDemoListIn(@Param("demoList") List<Demo> demoList);
}

这里的YourEntity是你要查询的目标实体,它必须包含name和date两个字段,和Demo的属性对应。

方案2:兼容性更强的EXISTS子查询写法

如果你的数据库不支持行值表达式(比如老版本MySQL),可以用EXISTS子查询来实现,兼容性拉满:

public interface YourEntityRepository extends JpaRepository<YourEntity, Long> {

    @Query("SELECT e FROM YourEntity e WHERE EXISTS (" +
           "SELECT d FROM :demoList d WHERE d.name = e.name AND d.date = e.date)")
    List<YourEntity> findByDemoList(@Param("demoList") List<Demo> demoList);
}

这个逻辑是:遍历目标实体的每一条记录,检查是否存在传入的Demo列表里的某个对象,其name和date都和当前记录匹配。

注意事项

  • 不管用哪种方案,Demo类必须提供name和date的getter方法,JPQL需要通过这些方法读取属性值
  • 如果Demo是实体类(加了@Entity),JPQL会默认用主键匹配,这时候你要确保是用属性匹配的话,得明确写出d.name和d.date
  • 测试的时候注意日期类型的匹配,确保传入的Date格式和数据库存储的一致,避免时区或格式问题

备注:内容来源于stack exchange,提问作者Tarun Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 10:43:02