복붙노트

[SPRING] @NamedQuery가 Spring 데이터 나머지에서 findAll을 오버라이드합니다. JpaRepository

SPRING

@NamedQuery가 Spring 데이터 나머지에서 findAll을 오버라이드합니다. JpaRepository

Spring 데이터 나머지에 의해 실행 된 findAll 쿼리를 오버라이드 할 수있는 방법이 있습니까?

몇 가지 구체적인 기준에 따라 결과를 필터링하는 방법이 필요하며 @NamedQuery를 사용하면 내가 원하는 것을 찾았을 것입니다. 그래서 테스트를 설정합니다.

@Entity
@Table(name = "users")
@NamedQueries({
    @NamedQuery(name = "User.findAll", query="SELECT u FROM User u WHERE u.username = 'test'"), 
    @NamedQuery(name = "User.findNameEqualsTest", query="SELECT u FROM User u WHERE u.username = 'test'")   
})
public class User implements Serializable, Identifiable<Long> { }

이 자리에서 나는 SDR이 내 findAll () 쿼리 (1 개의 결과를 반환)를 사용할 것으로 기대하지만, 대신 이전의 동일한 findAll 로직 (모든 결과를 반환)을 실행합니다.

내 저장소에 다음을 추가했습니다.

@Repository
@RestResource(path = "users", rel = "users")
public interface UserJpaRepository extends JpaRepository<User, Long> {

    public Page<User> findNameEqualsTest(Pageable pageable);
}

이 경우 제공된 @NamedQuery를 선택합니다. 그래서...

기본 findAll () 로직을 재정의하려면 어떻게해야합니까? 실제로 복잡한 일련의 기준을 구성하고 결과 세트에 적용해야합니다.

해결법

  1. ==============================

    1.예, 저장소 인터페이스의 구현을 만들 수 있습니다.

    예, 저장소 인터페이스의 구현을 만들 수 있습니다.

    http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/repositories.html#repositories.custom-implementations

    저장소

       @Repository
        public interface PagLogRepository extends JpaRepository<PagLogEntity, Long>, PagLogCustomRepository {
    

    사용자 인터페이스

    public interface PagLogCustomRepository {
    PagLogEntity save(SalesForceForm salesForceForm) throws ResourceNotFoundException;
    

    맞춤 구현

    public class PagLogRepositoryImpl implements PagLogCustomRepository {
    @Override
        public PagLogEntity save(final SalesForceForm salesForceForm) throws ResourceNotFoundException {
    
            query = emEntityManager.createNamedQuery("findItemFileByDenormalizedSku", ItemFileEntity.class);
            query.setParameter("skuValue", rawSku);
    

    다시 정의하지 않고 findAll로 저장 한 다음 복잡한 사용자 정의를 작성할 수 있습니다.

  2. ==============================

    2.Spring Data JPA의 차후 버전 1.5 (RC는 마일스톤 저장소에서 사용 가능)에서 저장소 인터페이스의 메소드를 다시 선언하고 @Query로 주석을 달아 쿼리 메소드로 실행되도록합니다. 이렇게하면 쿼리 메서드에서 이미 익숙해 진 것처럼 명명 된 쿼리가 조회됩니다.

    Spring Data JPA의 차후 버전 1.5 (RC는 마일스톤 저장소에서 사용 가능)에서 저장소 인터페이스의 메소드를 다시 선언하고 @Query로 주석을 달아 쿼리 메소드로 실행되도록합니다. 이렇게하면 쿼리 메서드에서 이미 익숙해 진 것처럼 명명 된 쿼리가 조회됩니다.

    interface UserJpaRepository extends PagingAndSortingRepository<User, Long> {
    
      @Query
      List<User> findAll();
    
      Page<User> findNameEqualsTest(Pageable pageable);
    }
    

    저장소 선언에 대한 몇 가지 참고 사항 :

  3. from https://stackoverflow.com/questions/21734149/namedquery-override-findall-in-spring-data-rest-jparepository by cc-by-sa and MIT license