【问题标题】:Spring Boot JPA Pagination ExceptionSpring Boot JPA 分页异常
【发布时间】:2019-02-21 14:41:33
【问题描述】:

我正在为我的服务实现分页,其中限制和偏移是请求正文的一部分。当我在服务级别的 PageRequest 中设置这些值时,我收到以下错误和实现

Caused by: java.lang.IllegalArgumentException: Either use @Param on all parameters except Pageable and Sort typed once, or none at all!
    at org.springframework.util.Assert.isTrue(Assert.java:92) ~[spring-core-4.3.12.RELEASE.jar:4.3.12.RELEASE]
    at org.springframework.data.repository.query.Parameters.assertEitherAllParamAnnotatedOrNone(Parameters.java:297) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
    at org.springframework.data.repository.query.Parameters.<init>(Parameters.java:91) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.JpaParameters.<init>(JpaParameters.java:43) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.JpaQueryMethod.createParameters(JpaQueryMethod.java:325) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.JpaQueryMethod.createParameters(JpaQueryMethod.java:53) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
    at org.springframework.data.repository.query.QueryMethod.<init>(QueryMethod.java:77) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.JpaQueryMethod.<init>(JpaQueryMethod.java:89) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:77) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:436) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:221) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:277) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:263) ~[spring-data-commons-1.13.8.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:101) ~[spring-data-jpa-1.11.8.RELEASE.jar:na]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]
    ... 55 common frames omitted

学生要求:

{
  "name": "string",
  "paging": {
    "limit": 0,
    "startOffset": 0
  }
}

学生服务:

@Service
public class StudentService {

    @Autowired
    private StudentRepository studentRepository;

    public List<Student> getAllStudents(StudentRequest studentRequest) {

       List<Student> studentList = studentRepository.getAll(studentRequest,new PageRequest(studentRequest.getPaging().getStartOffset(), studentRequest.getPaging().getLimit()));
       return studentList;
    }
}

学生资料库:

@Repository
public interface StudentRepository extends CrudRepository<Student, Long> {

    @Query(value = "select o from Student  o  where (o.name = :#{#studentRequest.name} OR :#{#studentRequest.name} IS NULL ) ")
    public List<Student> getAll(@Param("studentRequest") StudentRequest studentRequest, PageRequest pageRequest);
}

【问题讨论】:

    标签: java spring spring-boot spring-data-jpa jpql


    【解决方案1】:

    检查错误:

    use @Param on all parameters except Pageable and Sort typed once, or none at all!

    这意味着您不能Pageable(或PageRequest)和Sort参数中使用@Param,它们由spring自动处理。

    只需删除 @Param("pageRequest") 即可。

    提示:使用Pageable 接口而不是PageRequest 类。

    【讨论】:

    • 如果我的请求没有limit和start offset值怎么办?
    • 将应用默认值。 25 表示限制和第 0 页。
    • Limit 实际上是作为 size 属性处理的
    • @Devidi Cavarazan:我认为它没有采用默认值,这就是它抛出异常的原因。创建 PageRequest 对象时是否应该手动传递值 0 和 25?
    • 嗯,使用 Pageable 作为参数应该应用它。你如何构建你的 URL 来调用这个资源?
    【解决方案2】:

    看起来失败的断言只是想让你要么拥有AllParamAnnotatedOrNone。所以你会这样做:

    public List<Student> getAll(@Param("studentRequest") StudentRequest studentRequest, 
        @Param("pageRequest") PageRequest pageRequest);
    

    即使你没有使用它;您只需要一种模式(即命名为 Spring Data 参数)或另一种模式(即推断的 Spring Data 参数名称)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-31
      • 2018-02-26
      • 1970-01-01
      • 2018-02-04
      • 2021-10-03
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多