JPA/Querydsl
Querydsl의 수정, 삭제 쿼리
chanhee01
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절로 조건을 넣어준다.