보통 조인을 많이 사용하게 될 상황이 생기면 JPA Native query를 사용한다.
이 때, 조인되어지는 테이블들의 column 값을 사용해야하는 상황에는 Entity에 맵핑을 시켜줄 수 없는 문제가 있다.
이럴 때에는 바로 원하는 변수가 있는 DTO에 맵핑을 시켜주어야 하는데,,
어떤 방법들이 있을까?
1. Entity에서의 `@SqlResultSetMapping` 사용
@Entity
@NamedNativeQuery(
name = "find_books',
query =
"SELECT " +
" 생략.... ",
resultSetMapping = "book_dto"
)
@SqlResultSetMapping(
name = "book_dto",
classes = @ConstructorResult(
targetClass = BookDto.class,
columns = {
@ColumnResult(name = "bookId", type = Long.class),
@ColumnResult(name = "writerName", type = String.class),
@ColumnResult(name = "launguage", type = String.class)
}
)
)
@Repository
public interface BookRepository extends JpaRepository<Book, Long>, {
@Query(name = "find_books_dto", nativeQuery = true)
List<BookDto> findAllBook(...생략);
}
2. Interface 로 선언한 Dto에 맵핑 - getter를 선언해줘야 한다.
public interface BookDto {
getTitle();
getWriterName();
getLanguage();
}
@Repository
public interface BookRepository extends JpaRepository<Book, Long>, {
@Query(value = "SELECT * FROM ... 생략", nativeQuery = true)
List<BookDto> findAllBook(...생략);
}
만약 DTO를 그대로 클라이언트에게 주어줘도 상관이 없다면 interface ( with getter) 를 사용하여 맵핑을 시켜주어도 상관 없을 듯 하고, 만약 DTO의 변화가 필요하다면 1 번의 방식을 사용해서 맵핑을 시켜주면 될 것 같다.
혹시.. 더 좋은 방법이 있다면 알려주시면 감사하겠습니다!
반응형
'Back-end > JPA' 카테고리의 다른 글
[JPA] native query 사용 시 enum을 변수로 하기 ( SpEL expression ) (0) | 2022.04.03 |
---|---|
[JPA] JPA (Java Persistence API)란? (0) | 2020.09.08 |