Spring Boot JPA Pagination Exception (Исключение разбивки на страницы в JPA)

Я реализую разбиение на страницы для своей службы, где лимит и смещение входят в тело запроса. Когда я установил эти значения в 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);
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 144
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, что неверное утверждение просто хочет, чтобы у вас был либо AllParamAnnotatedOrNone. Итак, вы бы сделали:

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

Даже если вы им не пользуетесь; вам просто нужен один шаблон (то есть с именем Spring Data params) здесь или другой (то есть предполагаемые имена параметров Spring Data).

Ответ принят как подходящий

Проверьте ошибку:

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

Это означает, что вы не мочь используете @Param в параметрах Pageable (или PageRequest) и Sort, они автоматически обрабатываются Spring.

Просто удалите @Param("pageRequest"), и он будет работать.

Совет: используйте интерфейс Pageable вместо класса PageRequest.

Как поступить, если в моем запросе нет значений предельного и начального смещения?

user8363477 18.09.2018 17:08

Будут применяться значения по умолчанию. 25 для лимита и страница 0.

Deividi Cavarzan 18.09.2018 17:14

Предел фактически обрабатывается как свойство размера

Deividi Cavarzan 18.09.2018 17:19

@Devidi Cavarazan: Я не думаю, что он принимает значения по умолчанию, поэтому выдает исключение. Должен ли я передавать значения 0 и 25 вручную при создании объекта PageRequest?

user8363477 18.09.2018 17:43

Хм, используя Pageable в качестве параметра, он должен его применить. Как вы создаете свой URL-адрес для вызова этого ресурса?

Deividi Cavarzan 18.09.2018 22:22

Это будет почтовый запрос, в котором эти параметры определены в теле запроса. Я разместил запрос в вопросе.

user8363477 19.09.2018 09:29

@ user8363477, но сам URl такой: локальный: 8080 / api / xxx? page = 0 & size = 25

Deividi Cavarzan 19.09.2018 18:51

Другие вопросы по теме