web-dev-qa-db-ja.com

Spring仕様とPageable

SpecificationPageableを一緒に使用するにはどうすればよいですか?

personelRepository.Java

@Query("SELECT e FROM PersonelEntity e ")
List<PersonelEntity> findData(Specification<PersonelEntity>  test, Pageable pageable);

personelService.Java

public List<PersonelEntity> filteredData(Specification<PersonelEntity> filter,Pageable  pageable){
    List<PersonelEntity> filteredData = personelRepository.findData(filter,pageable);
    return filteredData;
}

personelController.Java

Pageable reqCount = new PageRequest(0, 10);
Specification<PersonelEntity> filter = new FilterSpecification<PersonelEntity>(new SearchCriteria("name", "=","Lux"));
personels = personelService.findData(filter,reqCount);

実行すると、次のようなエラーが発生します。しかし、findAll(Pageable page)やfindAll(Specification filter)のようにfindAll()関数を個別に呼び出すと、機能します。でも一緒には使えません。

Java.lang.IllegalArgumentException: Parameter with that position [1] did not exist
    at org.hibernate.jpa.spi.BaseQueryImpl.findParameterRegistration(BaseQueryImpl.Java:502) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.jpa.spi.BaseQueryImpl.setParameter(BaseQueryImpl.Java:692) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.Java:181) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.jpa.spi.AbstractQueryImpl.setParameter(AbstractQueryImpl.Java:32) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
    at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.Java:141) ~[spring-data-jpa-1.11.1.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.StringQueryParameterBinder.bind(StringQueryParameterBinder.Java:61) ~[spring-data-jpa-1.11.1.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.Java:101) ~[spring-data-jpa-1.11.1.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.SpelExpressionStringQueryParameterBinder.bind(SpelExpressionStringQueryParameterBinder.Java:69) ~[spring-data-jpa-1.11.1.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.ParameterBinder.bindAndPrepare(ParameterBinder.Java:161) ~[spring-data-jpa-1.11.1.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.ParameterBinder.bindAndPrepare(ParameterBinder.Java:152) ~[spring-data-jpa-1.11.1.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery.doCreateQuery(AbstractStringBasedJpaQuery.Java:81) ~[spring-data-jpa-1.11.1.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.createQuery(AbstractJpaQuery.Java:190) ~[spring-data-jpa-1.11.1.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.Java:121) ~[spring-data-jpa-1.11.1.RELEASE.jar:na]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.Java:85) ~[spring-data-jpa-1.11.1.RELEASE.jar:na]
6
Yasin Mert

PersonelService.Javaを編集して解決し、personelRepositoryのfindData関数を削除します。 springframework.data.jpa.repository.JpaRepository findAll()関数を使用して動作します。

public List<PersonelEntity> filteredData (Specification<PersonelEntity> spec, Pageable pageable){
    Page<PersonelEntity> pageData = personelRepository.findAll(spec,pageable);
    List<PersonelEntity> filteredData = pageData.getContent();
    return filteredData;
}
7
Yasin Mert

ページネーションをサポートするには、countQueryを追加する必要があります

@Query(query ="SELECT e FROM PersonelEntity e "
      ,countQuery ="select count(e.id) from PersonelEntity e"

クエリでspecを参照する必要があると思います

0
StanislavL