복붙노트

[SPRING] Spring JPA : 동일한 쿼리 인터페이스에서 다중 프로젝션 사용하기

SPRING

Spring JPA : 동일한 쿼리 인터페이스에서 다중 프로젝션 사용하기

나는 질의 결과에서 불필요한 데이터를 필터링하기 위해 Spring JPA의 투영법을 사용하려고합니다. 그러나 동일한 인터페이스 메소드에서 사용해야하는 프로젝션이 여러 개 있습니다.

문제는, 다른 반환 개체와 동일한 메서드에서 데이터를 쿼리하려고하지만 자바 허용하지 않습니다.

쿼리는 메서드 이름을 기반으로 JPA에 의해 자동 생성되므로 메서드 이름을 변경할 수 없습니다.

새로운 인터페이스를 만드는 것 이외에 대안이 있을까요? 번거롭고 불필요하다고 생각하기 때문에요.

여기에 내가하려고하는 것의 샘플 코드가있다.

public interface UserRepository extends CrudRepository<UserAccount, Long> {

    AuthenticateProjection getByUsername(String username);

    UserDetailsProjection getByUsername(String username);

}
public interface AuthenticateProjection {

    @Value("#{target.username}")
    String getUsername();

    @Value("#{target.credentail.token}")
    String getHashPassword();
}

public interface UserDetailsProjection {

    @Value("#{target.username}")
    String getUsername();

    @Value("#{target.firstname}")
    String getFirstName();

    @Value("#{target.lastname}")
    String getLastName();
}

해결법

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

    1.그래서 저는 단일 쿼리로 여러 투영법을 사용하는 방법을 알아 냈습니다.

    그래서 저는 단일 쿼리로 여러 투영법을 사용하는 방법을 알아 냈습니다.

    <T> T getByUsername(String username, Class<T> projection)
    

    이를 통해 메서드 호출자는 쿼리에 적용 할 프로젝션 유형을 지정합니다.

    이 기능을 향상시키기 위해 오류가 발생하기 쉽도록 클래스를 매개 변수에 삽입 할 수 있도록 투영법을 확장해야하는 빈 인터페이스를 만들었습니다.

    public interface JPAProjection {
    }
    
    public interface UserRepository extends CrudRepository<UserAccount, Long> {
        <T extends JPAProjection > T getByUsername(String username, Class<? extends JPAProjection> projection);
    }
    
    public interface UserDetailsProjection extends JPAProjection{
        @Value("#{target.username}")
        String getUsername();
    
        @Value("#{target.firstname}")
        String getFirstname();
    
        @Value("#{target.lastname}")
        String getLastname();
    }
    

    그런 다음 쿼리 메서드를 호출 할 수 있습니다.

    getByUsername("...", UserDetailsProjection.class)
    
  2. from https://stackoverflow.com/questions/43352967/spring-jpa-using-multiple-projection-on-same-query-interface by cc-by-sa and MIT license