JPA/QueryDSL
QueryDSL 공부 7 - 수정 , 삭제 벌크성 쿼리
UGO04
2021. 6. 19. 20:07
반응형
JPA에서는 주로 변경감지(dirty checking)을 통해 데이터의 update 가 일어나는데 이 경우에는 개별 엔티티에 대해서 건마다 쿼리가 나가기 때문에 쿼리 한번으로 대량 데이터를 수정할 때는 벌크연산을 사용한다 .
QueryDsl에서 벌크연산 하는 방법을 알아 보자
1. 모든엔티티의 특정 컬럼을 변경하고 싶을때
@Test
public void bulk_update(){
long count = qf
.update(member)
.set(member.username, "비회원")
.where(member.age.lt(20))
.execute();
em.flush();
em.clear();
List<Member> fetch = qf.selectFrom(member).fetch();
for (Member member : fetch) {
System.out.println("member = " + member);
}
}
벌크연산은 영속성컨텍스트를 무시하고 바로 DB로 쿼리를 날린다 , 벌크연산후 해당 데이터를 조회하여 DB에서 데이터 퍼온다고 해도
영속성컨텍스트의 데이터가 우선되기 떄문에 영속성컨텍스트의 데이터가 리턴된다. 벌크연산 후에는 영속성 컨텍스트 초기화가 필요하다
update() set() execute()를 통해 업데이트가 가능하다 .
2.특정컬럼에 같은 값을 더하고 싶을때
age 라는 컬럼이 있고 모든엔티티에 해당 컬럼에 1씩 더하고 싶다면
@Test
public void bulkAdd(){
long execute = qf
.update(member)
//add , minus , multiple 다 가능하다.
.set(member.age, member.age.add(1))
.execute();
em.clear();
em.flush();
List<Member> fetch = qf.selectFrom(member).fetch();
for (Member member : fetch) {
System.out.println("member = " + member);
}
}
add() , minus(),multiple() 등의 메서드를 모두 제공한다. set()에서 첫번째인자는 바꾸고 싶은 컬럼, 두번째는 바꿀값 을 지정 해주면된다
3. 한번에 모두 삭제
@Test
void bulk_delete(){
long execute = qf
.delete(member)
.execute();
em.clear();
em.flush();
List<Member> fetch = qf.selectFrom(member).fetch();
for (Member member : fetch) {
System.out.println("member = " + member);
}
}
delete()를 사용하여 한번에 삭제 가능하다 .
반응형