[Querydsl] update 쿼리도 동적 쿼리로 작성이 가능할까?
동기
querydsl에서 select 쿼리를 만들 때는 where절에 들어갈 파라미터 값이 null인지에 따라 자유롭게 조건을 추가할 수 있었다.
즉, 동적 쿼리를 자유롭게 작성할 수 있었는데 과연 update 쿼리에서도 set절에 자유롭게 설정이 가능한지 궁금했다!
JPAUpdateClause
아래 코드를 보면, update()
도, set()
도 JPAUpdateClause를 반환한다.
update 쿼리를 실행하려면 최종적으로 JPAUpdateClause.execute()
를 호출해줘야 하고, 그 이전에는 set()
을 메서드 체이닝으로 얼마든지 추가해줄 수 있다.
JPAUpdateClause clause = queryFactory
.update(user);
JPAUpdateClause clause2 = queryFactory
.update(user)
.set(user.username, username)
.set(user.email, email);
clause.execute();
clause2.execute();
얼마든지 추가해줄 수 있다면, 동적 쿼리로 작성이 가능하다는 뜻이 된다! 그렇다면 분기를 타서 쿼리를 마음껏 수정할 수 있다.
아래는 파라미터로 받은 username이 null이면 set을 하지 않고, not null이면 set을 하는 예제다.
public void updateUsername(String username) {
JPAUpdateClause clause = queryFactory
.update(user);
if (username != null) {
clause.set(user.username, username);
}
clause.execute();
}
댓글남기기