[SPRING] JPA - Native Query

RuiN·2022년 8월 1일
0

Spring

목록 보기
1/8
post-thumbnail

Native Query

JPA Repository로 간단하게 Mapping과 더불어, Entity를 손쉽게 다룰 수 있죠
하지만 우리가 Serivce를 하기 위해서는 최소의 로직으로 최대의 결과를 낼 수 있게 개발하는 것이 가장 올바른 Programming 이겠죠??

 @Test
    void nativeQueryTest() {

        List<Book> books = bookRepository.findAll();

        for (Book book : books) {
            book.setCategory("IT전문서");
        }

        bookRepository.saveAll(books);

        System.out.println(bookRepository.findAll());

    }

만약 위와 같은 Test 를 만든후에 실행시켜보면!
올바른 결과가 나오게 되지만..

Hibernate: 
   update
       book 
   set
       updated_at=?,
       author_id=?,
       category=?,
       deleted=?,
       name=?,
       publisher_id=? 
   where
       id=?
Hibernate: 
   update
       book 
   set
       updated_at=?,
       author_id=?,
       category=?,
       deleted=?,
       name=?,
       publisher_id=? 
   where
       id=?

다음과 같이 데이터의 갯수만큼 update문이 일어나게 됩니다.
지금은 2개의 Update뿐이지만, 만약 백개, 천개, 아니 수만개의 데이터를 Update 해야한다면
속도 저하는 물론, 비용또한 늘어나겠죠??


@Query(value = "" )

이제 여기서 진가를 발휘합니다.


public interface BookRepository extends JpaRepository<Book, Long> {

 @Transactional
  @Modifying
  @Query(value = "update book set category = 'IT전문서'", nativeQuery = true)
  int updateCategories();
  
  }

위와 같은 로직을 Repository에 작성해줍니다.
( int 로 선언해주면, Update가 일어난 횟수를 나타내줍니다.)

    @Test
  void nativeQueryTest() {

      List<Book> books = bookRepository.findAll();

      for (Book book : books) {
          book.setCategory("IT전문서");
      }

      bookRepository.saveAll(books);

      System.out.println(bookRepository.findAll());
      System.out.println("affected Rows : " + bookRepository.updateCategories());
  }

다음과 같이 Test 또한 작성해주고 실행해보면!

Hibernate: 
  update
      book 
  set
      category = 'IT전문서'
affected Rows : 3

위와 같이 한번의 Update문과 함께 모든 데이터가 변경된것을 확인할 수 있습니다.


+@ SQL

    @Query(value = "show tables",nativeQuery = true)
    List<String> showTables();

위와 같은 로직또한 말그대로 'Show Tables' > SQL 문법이 가능하게 됩니다.

TEST 작성은 생략하고

          System.out.println(bookRepository.showTables());

위의 문장을 출력해보면

Hibernate: 
    show tables
[author, book, book_and_author, book_review_info, publisher, review, user, user_history]

위 처럼 현재 Mapping 되어있는 Entity 들의 Table을 모두 볼 수 있게 됩니다.


profile
어디까지 올라갈지 궁금한 하루

0개의 댓글