-
Querydsl의 수정, 삭제 쿼리JPA/Querydsl 2023. 8. 13. 15:54
벌크 연산
@Test public void bulkUpdate() { long count = queryFactory .update(member) .set(member.username, "미성년자") .where(member.age.lt(23)) .execute();// 업데이트 쿼리, 반환 타입은 영향을 받은 로우 수 }
member1과 member2의 이름을 미성년자라 수정하는 쿼리이다. 하지만 벌크 연산은 영속성 컨텍스트를 무시하고 바로 db를 수정하기 때문에 영속성 컨텍스트의 데이터와 db의 데이터가 달라서 충돌이 생길 수가 있다.
이 상태에서 바로 select를 하면 영속성 컨텍스트에서 데이터를 가져오기 때문에 변경되지 않는 데이터가 나온다.
벌크연산 - 영속성 컨텍스트 초기화 필요
@Test public void bulkUpdate() { long count = queryFactory .update(member) .set(member.username, "미성년자") .where(member.age.lt(23)) .execute();// 업데이트 쿼리, 반환 타입은 영향을 받은 로우 수 em.flush(); em.clear(); List<Member> result = queryFactory.selectFrom(member).fetch(); for (Member member : result) { System.out.println(member); } }
벌크 연산을 사용하고 싶으면 em.flush()와 em.clear()로 영속성 컨텍스트를 초기화 시켜야한다.
간단한 수정 쿼리
@Test public void bulkAdd() { queryFactory .update(member) .set(member.age, member.age.add(1)) .execute(); }
모든 member의 나이를 하나씩 증가하려면 set(member.age, member.age.add(1))을 해주면 된다. minus는 따로 없기 때문에 add(-1)로 사용해야 한다. 곱하기는 multiply(2)를 통해 곱할 수 있다.
데이터 삭제 쿼리
@Test public void bulkDelete() { queryFactory .delete(member) .where(member.age.gt(18)) // set이 아니라 where .execute(); }
삭제하는 delete 쿼리는 update가 아닌 delete 쿼리를 날리고 update에서 사용했던 set이 아니라 where절로 조건을 넣어준다.
'JPA > Querydsl' 카테고리의 다른 글
스프링 데이터 JPA와 Querydsl 동시 사용 (0) 2023.08.13 Querydls 동적 쿼리 활용 (0) 2023.08.13 Querydsl의 동적 쿼리 (0) 2023.08.13 Dto로 프로젝션 결과 반환 (0) 2023.08.13 Querydsl - Case 문 (0) 2023.08.13