Specification
とPageable
を一緒に使用するにはどうすればよいですか?
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]
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;
}
ページネーションをサポートするには、countQuery
を追加する必要があります
@Query(query ="SELECT e FROM PersonelEntity e "
,countQuery ="select count(e.id) from PersonelEntity e"
クエリでspec
を参照する必要があると思います