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 해야한다면
속도 저하는 물론, 비용또한 늘어나겠죠??
이제 여기서 진가를 발휘합니다.
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문과 함께 모든 데이터가 변경된것을 확인할 수 있습니다.
@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을 모두 볼 수 있게 됩니다.