Pagination Spring boot JPA Exception: у метода должен быть один из следующих типов возврата - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь отобразить выбранные записи на странице, используя нумерацию страниц, используя JPQL. Мой основной интерфейс репо расширяет интерфейс репозитория PagingAndSorting. Ниже приведены мои уроки

StudentRepositoryPaging.java

package com.hibernate.JPQLandNativeSql.repos;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;

import com.hibernate.JPQLandNativeSql.entities.Student;
//To enable paging support, we just need to pass "Pageable" as a parameter to the methods as an arg
public interface StudentRepositoryPaging extends PagingAndSortingRepository<Student, Long> 
{
    @Query("from Student") //for executing JPQL, we write our queries inside @query annotation,this query is : "select * from Student" but we can also write it as "from Student"
    Page<Student> findAllStudents(Pageable page); //this will return a list. 

    @Query("select st.fname , st.lname from Student st")
    Page<Object[]> findAllStudentsPartial(Pageable page);// this will return an object array containing the returned columns

    @Query("from Student where fname=:fname")
    List<Student> findAllStudentsByFirstName(@Param("fname")String fname,Pageable page); //named queries using which you can pass arguments and those arguments can be used in queries

    @Query("select lname,score from Student where fname=:fname")
    List<Object[]> findAllStudentsByFirstNamePartial(@Param("fname")String fname,Pageable page); //named queries using which you can pass arguments and those arguments can be used in queries

    @Query("from Student where score>:min and score<:max")
    List<Student> findAllStudentsByScore(@Param("min")int min,@Param("max")int max,Pageable page);

    @Modifying //if we are using statements such as insert , update , delete, we need to use@Modifying, because Hibernate assumes that we are using select statements
    @Query("delete from Student where id=:id")
    void deleteFromTable(Long id,Pageable page);

}

Метод тестирования: testFindAllPaging.java

@Test
    public void testFindAllPaging() {
        int pageNumber=0;
        int pageSize = 2;//number of database records to be displayed per page
        Pageable page = PageRequest.of(pageNumber, pageSize,Sort.by(Direction.DESC,"fname"));
        //Page<Student> findAllStudents = reposPaging.findAllStudents(page);
        Page<Object[]> studentsPartial = reposPaging.findAllStudentsPartial(page);
        for(Object[] s : studentsPartial ) {
            System.out.println(s[0]+"-----"+s[1]);
        }
    }

Ниже приведены результаты в моей таблице

enter image description here

Когда я запускаю свой метод испытаний, я получаю ошибку ниже:

Caused by: java.lang.IllegalStateException: Method has to have one of the following return types! [interface org.springframework.data.domain.Page, interface org.springframework.data.domain.Slice, interface java.util.List]
    at org.springframework.data.repository.query.QueryMethod.assertReturnTypeAssignable(QueryMethod.java:307) ~[spring-data-commons-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.repository.query.QueryMethod.<init>(QueryMethod.java:87) ~[spring-data-commons-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.jpa.repository.query.JpaQueryMethod.<init>(JpaQueryMethod.java:103) ~[spring-data-jpa-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:79) ~[spring-data-jpa-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lookupQuery(RepositoryFactorySupport.java:574) ~[spring-data-commons-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$mapMethodsToQuery$1(RepositoryFactorySupport.java:567) ~[spring-data-commons-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_231]
    at java.util.Iterator.forEachRemaining(Iterator.java:116) ~[na:1.8.0_231]

Куда я иду не так?

1 Ответ

0 голосов
/ 08 ноября 2019

Тип возврата Page<Object[]> будет работать только с собственными запросами. Так что метод должен выглядеть так:

@Query(value = "select st.fname , st.lname from Student st", nativeQuery = true)
Page<Object[]> findAllStudentsPartial(Pageable page);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...