source

spring data jpa @pageable 및 페이지 가능

itover 2022. 10. 18. 23:19
반응형

spring data jpa @pageable 및 페이지 가능

JPA를 Spring Data 를 사용하면@Query없는 쿼리를 정의하다 Pageable★★★★

public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {
    @Query(value = "select * from internal_uddi where urn like %?1% or contact like %?1%", 
           nativeQuery = true)
    List<UrnMapping> fullTextSearch(String text);
}

, 두 Pageable , . . . . . . . .@Query동작하지 않고 Spring은 메서드의 이름을 해석한 후 예외를 슬로우합니다. No property full found★★★★★★★★★★★★★★★★★?

public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {
    @Query(value = "select * from internal_uddi where urn like %?1% or contact like %?1%",
           nativeQuery = true)
    Page<UrnMapping> fullTextSearch(String text, Pageable pageable);
}

네이티브 쿼리에 페이지 매김을 사용할 수 있습니다.이 매뉴얼은 스프링 데이터 JPA - 레퍼런스 매뉴얼에 기재되어 있습니다.

"단, 카운트 쿼리를 직접 지정함으로써 페이지 번호 부여에 네이티브 쿼리를 사용할 수 있습니다(예 59). 쿼리 메서드에서 @Query를 사용하여 페이지 번호 매기기 네이티브 카운트 쿼리를 선언합니다.

public interface UserRepository extends JpaRepository<User, Long> {

  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
    nativeQuery = true)
  Page<User> findByLastname(String lastname, Pageable pageable);
}

Spring 포럼에서도 비슷한 질문이 제기되었는데, 페이지 매김을 적용하려면 두 번째 서브쿼리를 도출해야 한다는 지적이 있었다.하위 쿼리는 동일한 필드를 참조하므로 쿼리에서 참조하는 엔티티/테이블에 대한 별칭을 사용해야 합니다.즉, 다음과 같이 기재되어 있습니다.

select * from internal_uddi where urn like

대신 다음 사항이 필요합니다.

select * from internal_uddi iu where iu.urn like ...

「 」가 「 」라고 하는 하면,UrnMapping.internal_uddi츠키다

@Repository
public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {

    @Query(value = "select iu from UrnMapping iu where iu.urn like %:text% or iu.contact like %:text%")
    Page<UrnMapping> fullTextSearch(@Param("text") String text, Pageable pageable);
}

동적 요청이 있는 경우 네이티브 쿼리를 해제해야 할 수 있습니다.

@Query를 사용하면 JPA 메서드의 마지막에 Pageable 클래스의 오브젝트를 전달해야 하는 경우에도 페이지네이션 기능을 사용할 수 있습니다.

예를 들어 다음과 같습니다.

Pageable pageableRequest = new PageRequest(page, size, Sort.Direction.DESC, rollNo);

여기서 페이지 = 페이지 색인(인덱스는 0부터 시작)
= number = "number of records" (레코드 수
=에 합니다.Direction = [No]
= User classrollNo = roll roll roll roll roll roll roll roll roll roll roll roll roll roll roll roll roll roll roll roll 。

UserRepository repo
repo.findByFirstname("John", pageableRequest);

public interface UserRepository extends JpaRepository<User, Long> {

  @Query(value = "SELECT * FROM USER WHERE FIRSTNAME = :firstname)
  Page<User> findByLastname(@Param("firstname") String firstname, Pageable pageable);
}

Spring Data JPA 버전 2.0.4 이후를 사용하는 경우 Spring Data JPA @Query를 참조하십시오.샘플은 다음과 같습니다.

@Query(value = "SELECT u FROM User u ORDER BY id")
Page<User> findAllUsersWithPagination(Pageable pageable);

쿼리 메서드에서 @Query를 사용하여 페이지 번호 매기기 네이티브 카운트 쿼리를 선언합니다.

public interface UserRepository extends JpaRepository<User, Long> {

  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
  countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
  nativeQuery = true)
  Page<User> findByLastname(String lastname, Pageable pageable);

}

도움이 되었으면 좋겠다

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ #jpa.http://https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

쿼리를 다음과 같이 다시 작성합니다.

select iu from internal_uddi iu where iu.urn.... 

설명 : http://forum.spring.io/forum/spring-projects/data/126415-is-it-possible-to-use-query-and-pageable?p=611398#post611398

jpa 버전에 따라 동작하는 방법이 다르다는 것을 알았습니다.디버깅의 경우 생성된 sql을 표시하기 위해 이 구성을 추가하는 것이 좋습니다.이것에 의해, 시간이 큰폭으로 절약됩니다.

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

스프링 부트 2.1.6의 경우.릴리스, 잘 작동한다!

Sort sort = new Sort(Sort.Direction.DESC, "column_name");
int pageNumber = 3, pageSize = 5;
Pageable pageable = PageRequest.of(pageNumber - 1, pageSize, sort);
@Query(value = "select * from integrity_score_view " +
        "where (?1 is null or data_hour >= ?1 ) " +
        "and (?2 is null or data_hour <= ?2 ) " +
        "and (?3 is null or ?3 = '' or park_no = ?3 ) " +
        "group by park_name, data_hour ",
        countQuery = "select count(*) from integrity_score_view " +
                "where (?1 is null or data_hour >= ?1 ) " +
                "and (?2 is null or data_hour <= ?2 ) " +
                "and (?3 is null or ?3 = '' or park_no = ?3 ) " +
                "group by park_name, data_hour",
        nativeQuery = true
)
Page<IntegrityScoreView> queryParkView(Date from, Date to, String parkNo, Pageable pageable);

you는 쓰지 .order by ★★★★★★★★★★★★★★★★★」limit sql "sql" 을 생성합니다

저도 같은 문제가 있었습니다.Pageable방법은 정상적으로 동작합니다.
메서드 매개 변수로 추가된 경우 - 작동하지 않습니다.

DB 콘솔과 네이티브 쿼리 지원을 사용한 후 이 방법이 정상적으로 작동한다는 결정을 내렸습니다.단, 대문자가능합니다.
내 지원서의 논리는 이것뿐이었다.names엔티티의 선두는 대문자입니다.

조금 가지고 놀다.그리고 그 사실을 알아보세요IgnoreCase메서드 이름으로 "실행"을 수행합니다.다음은 현용 솔루션입니다.

public interface EmployeeRepository 
                            extends PagingAndSortingRepository<Employee, Integer> {

    Page<Employee> findAllByNameIgnoreCaseStartsWith(String name, Pageable pageable);

}

여기서 엔티티는 다음과 같습니다.

@Data
@Entity
@Table(name = "tblEmployees")
public class Employee {

    @Id
    @Column(name = "empID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotEmpty
    @Size(min = 2, max = 20)
    @Column(name = "empName", length = 25)
    private String name;

    @Column(name = "empActive")
    private Boolean active;

    @ManyToOne
    @JoinColumn(name = "emp_dpID")
    private Department department;
}

위의 모든 솔루션을 시도했지만 작동하지 않았습니다.마지막으로 페이지 표시에서 정렬을 삭제했더니 동작했습니다.

다음 튜토리얼이 도움이 되었습니다.-> https://www.baeldung.com/spring-data-jpa-query

현시점에서는 4.3.스프링 데이터 JPA 2.0.4 이전 버전

매우 중요한 추가 사항\ n-- #pageable \ n이것이 없었다면 나는 틀렸다.

또한 페이지 번호 설정은 주문하지 않아야 합니다.

PageRequest paginaConf = new PageRequest ((param1 - 1)
                                                 , param2);

마지막으로 페이지 <오브젝트 []>를 변환합니다.

  Page <Object []> list = myQueryofRepo ();
         List <XXXModel> lstReturn = myConversor (list.getContent ());
         Page <XXXModel> ret = new PageImpl <XXXModel> (lstReturn, pageConf, param2);

(nativeQuery = true)를 가진 nativeQuery를 사용하는 경우 (LIMIT : sizeValue OFFSET : page)를 추가하여 쿼리에서 직접 페이지 매김을 수행할 수 있습니다.

참고: 이 메서드에 전달된 페이지 값은 오프셋 * 크기여야 합니다.

 @Query(value = "SELECT * FROM person " +    
                   "LIMIT ?1 OFFSET ?2", nativeQuery = true)
    Optional<List<TDriverJob>> findPersons(int size, int page);

언급URL : https://stackoverflow.com/questions/22345081/spring-data-jpa-query-and-pageable

반응형