<aside> 💡 일반적으로 아는 SQL문에 update 와 delete 문이라 보면 됨

</aside>

✅ 벌크 연산 예제

String qlString = "update Product p " +
								 "set p.price = p.price * 1.1 " + 
								 "where p.stockAmount < :stockAmount"; 
int resultCount = em.createQuery(qlString)
					 .setParameter("stockAmount", 10) 
					 .executeUpdate();

✅ 벌크 연산 주의

// Flush 자동 호출 함
// 영속성 컨텍스트에는 20살이 반영이 안되있는 데 DB에는 20살로 반영 
int resultCount = em.createQuery("update Member m set m.age = 20")
					 .setParameter("stockAmount", 10) 
					 .executeUpdate();

System.out.println(member1.getAge()); // 0
System.out.println(member2.getAge()); // 0
System.out.println(member3.getAge()); // 0

💡 해결 법 • 벌크 연산을 먼저 실행 • 벌크 연산 수행 후 영속성 컨텍스트 초기화

// Flush 자동 호출 함
int resultCount = em.createQuery("update Member m set m.age = 20") //한방 쿼리로 DB에만 반영
					 .setParameter("stockAmount", 10) 
					 .executeUpdate();

**em.clear(); // 영속성 컨텍스트 초기화 함!**

// 이거는 영속성 컨텍스트에 아무것도 없기 때문에 새로 가져
Member findMember = em.find(Member.class, member1.getId()); 
System.out.println(findMember.getAge()); // 20

💡 Spring Data JPA 에서는 이렇게 편리하게 사용