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

使用Spring Boot Data Rest时如何在父实体范围内搜索

如何在关联实体上使用自定义查询方法过滤子实体

当然可以实现classes/1/students/search/findByName?name=Tom这种查询,报错的原因是你的findByName方法没有关联父实体(Class)的过滤条件,Spring Data REST无法自动把路径中的班级ID绑定到查询参数里。

解决方法很直接,只需调整StudentRepository中的查询方法定义:

  1. 修改查询方法,加入父实体过滤条件
    在你的StudentRepository接口中,新增包含班级(或班级ID)和学生姓名的查询方法,比如:

    import org.springframework.data.repository.PagingAndSortingRepository;
    import org.springframework.data.rest.core.annotation.RepositoryRestResource;
    import org.springframework.data.rest.core.annotation.RestResource;
    import java.util.List;
    
    @RepositoryRestResource(collectionResourceRel = "students", path = "students")
    public interface StudentRepository extends PagingAndSortingRepository<Student, Long> {
    
        // 方法1:通过班级ID和姓名查询
        @RestResource(path = "findByName", rel = "findByName")
        List<Student> findByClazzIdAndName(Long clazzId, String name);
    
        // 方法2:通过班级实体和姓名查询(Spring Data REST会自动解析路径中的班级ID为Clazz对象)
        // @RestResource(path = "findByName", rel = "findByName")
        // List<Student> findByClazzAndName(Clazz clazz, String name);
    }
    

    注:如果你的班级实体因为class是Java关键字而命名为Clazz,这里要对应调整;如果实体名就是Class,记得在实体上用@Entity(name = "classes")指定数据库表名,避免冲突。

  2. 验证请求路径
    修改完成后重启应用,再次发送请求classes/1/students/search/findByName?name=Tom,Spring Data REST会自动将路径中的1作为clazzId(或clazz实体)参数,结合name=Tom过滤出指定班级下的学生。

原理:Spring Data REST会解析嵌套路径中的父实体ID,并将其绑定到查询方法中对应的父实体/ID参数上,这样就能实现基于父实体范围的子实体自定义查询。

内容的提问来源于stack exchange,提问作者XintongTheCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:55:21