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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:45:29