Java Spring中@Query多参数查询及分页返回结构优化问题
问题1:@Query参数匹配错误导致AND条件无结果
你的查询语句里犯了一个基础错误:%?1%重复使用了第一个参数,也就是说不管你传入的surname是什么值,查询时都会用name参数的值去匹配surname字段。这就导致只有当某个学生的name和surname同时包含name参数的值时才会返回结果,而不是分别匹配传入的name和surname参数。
修正方法很简单,把查询语句里的第二个%?1%改成%?2%,对应方法的第二个参数surname:
interface StudentRepository extends JpaRepository<Student, Integer> { @Query("select s from Student s where s.name like %?1% and s.surname like %?2%") Page<Student> findByNameAndSurname(String name, String surname, Pageable pageable); }
另外注意你用name.orElse("_")作为默认值,_在SQL like里是匹配任意单个字符的通配符,如果你希望参数为空时不做该字段的过滤(即匹配所有),应该改成%,或者用动态查询(比如Specification)来实现更灵活的条件组合。
问题2:移除分页元数据,仅返回Student列表
Page对象本身就包含分页元数据,如果你只需要返回学生条目,直接返回Page的content属性即可,它是一个List<Student>:
修改Controller的方法返回值和返回语句:
@GetMapping List<Student> getAllStudents(@RequestParam Optional<String> name, @RequestParam Optional<String> surname, @RequestParam Optional<Integer> page, @RequestParam Optional<String> sortBy) { Page<Student> studentPage = repository.findByNameAndSurname( name.orElse("_"), surname.orElse("_"), PageRequest.of( page.orElse(0), 5, Sort.Direction.ASC, sortBy.orElse("id") ) ); return studentPage.getContent(); }
这样返回的JSON就只会是学生对象的数组,不会包含任何分页元数据。
内容的提问来源于stack exchange,提问作者Bajter
相关产品推荐
相关产品推荐

