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 릴리스 트레인) 기준.
다음과 같이 쿼리 메서드를 정의 할 수있는 새로 도입 된 키워드 Top
와 First
키워드를 사용할 수 있습니다.
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의 새로운 릴리스 에반스 키워드를 사용하는 기능을 가지고 Top20
와 First
, 쿼리 결과를 제한하기를
그래서 당신은 지금 쓸 수 있습니다
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();