使用Spring Boot Data Rest时如何在父实体范围内搜索
如何在关联实体上使用自定义查询方法过滤子实体
当然可以实现classes/1/students/search/findByName?name=Tom这种查询,报错的原因是你的findByName方法没有关联父实体(Class)的过滤条件,Spring Data REST无法自动把路径中的班级ID绑定到查询参数里。
解决方法很直接,只需调整StudentRepository中的查询方法定义:
修改查询方法,加入父实体过滤条件
在你的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")指定数据库表名,避免冲突。验证请求路径
修改完成后重启应用,再次发送请求classes/1/students/search/findByName?name=Tom,Spring Data REST会自动将路径中的1作为clazzId(或clazz实体)参数,结合name=Tom过滤出指定班级下的学生。
原理:Spring Data REST会解析嵌套路径中的父实体ID,并将其绑定到查询方法中对应的父实体/ID参数上,这样就能实现基于父实体范围的子实体自定义查询。
内容的提问来源于stack exchange,提问作者XintongTheCoder
相关产品推荐
相关产品推荐

