Programming

Spring-Data-JPA 주석에 대한 setMaxResults?

procodes 2020. 8. 8. 13:41
반응형

Spring-Data-JPA 주석에 대한 setMaxResults?


Spring-Data-JPA를 프로젝트에 통합하려고합니다. 나를 혼란스럽게하는 한 가지는 주석으로 setMaxResults (n)을 어떻게 달성합니까?

예를 들어, 내 코드 :

public interface UserRepository extends CrudRepository<User , Long>
{
  @Query(value="From User u where u.otherObj = ?1 ")
  public User findByOhterObj(OtherObj otherObj);
}

one (and only one)otherObj에서 User 를 반환하기 만하면되지만 maxResults에 주석을다는 방법을 찾을 수 없습니다. 누군가 나에게 힌트를 줄 수 있습니까?

(mysql은 다음과 같이 불평합니다.

com.mysql.jdbc.JDBC4PreparedStatement@5add5415: select user0_.id as id100_, user0_.created as created100_ from User user0_ where user0_.id=2 limit ** NOT SPECIFIED **
WARN  util.JDBCExceptionReporter - SQL Error: 0, SQLState: 07001
ERROR util.JDBCExceptionReporter - No value specified for parameter 2

)

링크를 찾았습니다 : https://jira.springsource.org/browse/DATAJPA-147 , 시도했지만 실패했습니다. 지금은 불가능한 것 같나요? 왜 그런 중요한 기능이 Spring-Data에 내장되어 있지 않습니까?

이 기능을 수동으로 구현하는 경우 :

public class UserRepositoryImpl implements UserRepository

에서 미리 정의 된 수많은 메서드를 구현해야합니다 CrudRepository. 이것은 끔찍할 것입니다.

환경 : spring-3.1, spring-data-jpa-1.0.3.RELEASE.jar, spring-data-commons-core-1.1.0.RELEASE.jar


SpringData JPA 1.7.0 (Evans 릴리스 트레인) 기준.

다음과 같이 쿼리 메서드를 정의 할 수있는 새로 도입 된 키워드 TopFirst키워드를 사용할 수 있습니다.

findTop10ByLastnameOrderByFirstnameAsc(String lastname);

SpringData는 사용자가 정의한 숫자로 결과를 자동으로 제한합니다 (생략 된 경우 기본값은 1). 결과의 순서는 여기에서 관련됩니다 ( OrderBy예제에 표시된 절을 통해 또는 Sort메서드에 매개 변수를 전달하여 ). 자세한 내용은 블로그 게시물에서SpringData Evans 릴리스 트레인의 새로운 기능을 또는 문서 에서 이에 대한 .

이전 버전의 경우

데이터 조각 만 검색하기 위해 SpringData Pageable는 요청 측 인터페이스 와 함께 제공되는 페이지 매김 추상화를 사용합니다 .Page 사물의 결과 측에 추상화를 사용합니다. 그래서 당신은

public interface UserRepository extends Repository<User, Long> {

  List<User> findByUsername(String username, Pageable pageable);
}

다음과 같이 사용하십시오.

Pageable topTen = new PageRequest(0, 10);
List<User> result = repository.findByUsername("Matthews", topTen);

결과의 컨텍스트를 알아야하는 경우 (실제로 어떤 페이지입니까? 첫 번째 페이지입니까? 총 몇 개입니까?) Page반환 유형으로 사용하십시오.

public interface UserRepository extends Repository<User, Long> {

  Page<User> findByUsername(String username, Pageable pageable);
}

클라이언트 코드는 다음과 같이 할 수 있습니다.

Pageable topTen = new PageRequest(0, 10);
Page<User> result = repository.findByUsername("Matthews", topTen);
Assert.assertThat(result.isFirstPage(), is(true));

Page메타 데이터를 계산하기 위해 총 요소 수를 알아 내야하므로 리턴 유형으로 사용 하는 경우 실행할 실제 쿼리의 카운트 프로젝션을 트리거하지는 않습니다 . 그 외에도 PageRequest안정적인 결과를 얻으려면 실제로 에 정렬 정보를 장착해야합니다 . 그렇지 않으면 쿼리를 두 번 트리거하고 데이터가 변경되지 않은 경우에도 다른 결과를 얻을 수 있습니다.


Java 8 및 SpringData 1.7.0을 사용하는 경우 @Query최대 결과 설정과 주석 을 결합하려는 경우 기본 메서드를 사용할 수 있습니다 .

public interface UserRepository extends PagingAndSortingRepository<User,Long> {
  @Query("from User u where ...")
  List<User> findAllUsersWhereFoo(@Param("foo") Foo foo, Pageable pageable);

  default List<User> findTop10UsersWhereFoo(Foo foo) {
    return findAllUsersWhereFoo(foo, new PageRequest(0,10));
  }

}

다음과 같이 "주석 별 setMaxResults (n)"에 해당하는 것을 제공 할 수있는 방법이 있습니다.

public interface ISomething extends JpaRepository<XYZ, Long>
{
    @Query("FROM XYZ a WHERE a.eventDateTime < :before ORDER BY a.eventDateTime DESC")
    List<XYZ> findXYZRecords(@Param("before") Date before, Pageable pageable);
}

이것은 페이징 가능이 매개 변수로 전송 될 때 트릭을 수행해야합니다. 예를 들어 처음 10 개의 레코드를 가져 오려면 페이징 가능을 다음 값으로 설정해야합니다.

new PageRequest(0, 10)

SpringData Evans 사용 (1.7.0 RELEASE)

the new release of Spring Data JPA with another list of modules together called Evans has the feature of using keywords Top20 and First to limit the query result,

so you could now write

List<User> findTop20ByLastname(String lastname, Sort sort);

or

List<User> findTop20ByLastnameOrderByIdDesc(String lastname);

or for a single result

List<User> findFirstByLastnameOrderByIdDesc(String lastname);

Best choice for me is native query:

@Query(value="SELECT * FROM users WHERE other_obj = ?1 LIMIT 1", nativeQuery = true)
User findByOhterObj(OtherObj otherObj);

It's also posible using @QueryHints. Example bellow uses org.eclipse.persistence.config.QueryHints#JDBC_MAX_ROWS

@Query("SELECT u FROM User u WHERE .....")
@QueryHints(@QueryHint(name = JDBC_MAX_ROWS, value = "1"))
Voter findUser();

If your class @Repository extends JpaRepository you can use the example below.

int limited = 100;
Pageable pageable = new PageRequest(0,limited);
Page<Transaction> transactionsPage = transactionRepository.findAll(specification, pageable);
return transactionsPage.getContent();

getContent return a List<Transaction>.

참고URL : https://stackoverflow.com/questions/9314078/setmaxresults-for-spring-data-jpa-annotation

반응형