[java] 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)

함께라는 모듈의 또 다른 목록 봄 데이터 JPA의 새로운 릴리스 에반스 키워드를 사용하는 기능을 가지고 Top20First, 쿼리 결과를 제한하기를

그래서 당신은 지금 쓸 수 있습니다

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

또는

List<User> findTop20ByLastnameOrderByIdDesc(String lastname);

또는 단일 결과

List<User> findFirstByLastnameOrderByIdDesc(String lastname);

답변

나에게 가장 적합한 선택은 네이티브 쿼리입니다.

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


답변

클래스가 @Repository확장 되면 JpaRepository아래 예제를 사용할 수 있습니다.

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

getContent는 List<Transaction>.


답변

@QueryHints를 사용하는 것도 가능합니다. 예제는 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();