반응형
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()를 사용하여 한번에 삭제 가능하다 .
반응형
'JPA > QueryDSL' 카테고리의 다른 글
QueryDSL 공부 10 - Spring data JPA 에서 QueryDsl활용 (0) | 2021.06.20 |
---|---|
QueryDSL 공부 8 - Repository에서 활용 (0) | 2021.06.20 |
QueryDSL 공부 6 - 동적쿼리 (booleanBuilder) (0) | 2021.06.19 |
QueryDSL 공부 5 - 프로젝션과 결과 반환 (0) | 2021.06.19 |
QueryDSL 공부 4 - QueryDSL 활용2 (join문) (0) | 2021.06.19 |