Back-end/JPA

[JPA] JPA native query 사용시 dto mapping

보통 조인을 많이 사용하게 될 상황이 생기면 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 번의 방식을 사용해서 맵핑을 시켜주면 될 것 같다.

 

혹시.. 더 좋은 방법이 있다면 알려주시면 감사하겠습니다!

반응형