참고
참고!
NOTE
지금 서술하는 기술들은 잘 쓰이지않거나, 쓰는걸 권장하지 않는다!
•
물론 특정상황에서 사용할수는 있지만, 왠만해서는 자제할것
•
Specifications, Query By Example은 QueryDSL로 대처되므로 설명생략
Projections
NOTE
엔티티 대신 DTO를 편리하게 조회할 때 사용한다!
•
전체 엔티티 대신 회원 이름만 조회하고 싶은 경우를 가정해보자.
회원 이름만 조회하고 싶은 경우
public interface UsernameOnly {
String getUsername();
}
Java
복사
조회할 엔티티의 필드를 getter 형식으로 지정하면 해당 필드만 선택해서 조회한다!
public interface MemberRepositry ... {
List<UsernameOnly> findProjectionsByUsername(@Param("username") String username);
}
Java
복사
반환 타입을 잘 지정하자.
인터페이스 기반 Open Projection
public interface UsernameOnly {
@Value("#{target.username + ' ' + target.age}")
String getUsername();
}
Java
복사
스프링의 SpEL문법을 제공한다 (단 DB에서 필드를 모두 조회하기 때문에 JPQL SELECT 최적화가 안된다,)
클래스 기반 Projection
public class UsernameOnlyDto {
private final String username;
public UsernameOnlyDto(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
}
Java
복사
생성자의 파라미터 이름으로 매칭한다. (DTO 형식)
동적 Projections
<T> List<T> findProjectionsByUsername(@Param("username") String username, Class<T> type);
Java
복사
제네릭 타입을 지정해줄 수 있음
중첩 구조 처리
public interface NestedClosedProjection {
String getUsername();
TeamInfo getTeam();
interface TeamInfo {
String getName();
}
}
Java
복사
루트 엔티티만 최적화가되고, 2번째는 최적화가 안됨
결론 : 간단한거만 쓰고 복잡해지면 QueryDSL을 사용하자..
네이티브 쿼리
NOTE
가급적 네이티브 쿼리를 사용하지 않는 것이 좋다.
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query(value = "select * from member where username = ?", nativeQuery = true)
Member findByNativeQuery(String username);
}
Java
복사
에시 코드