중급 문법 - Part3


수정, 삭제 벌크 연산


앞선 학습 내용에서도 정리했지만, 벌크 연산을 하게 되면 영속성 컨텍스트와 DB의 상태를 동일하게 만들어줘야 한다. 따라서 벌크 연산을 하고 난 후에는 반드시 flush와 clear를 해줘야 한다.


쿼리 한번으로 대량 데이터 수정

하나의 쿼리로 여러 건의 row를 수정할 수 있다.

@Test
@DisplayName("수정, 삭제 벌크 연산")
public void test10() throws Exception {

    long count = queryFactory
            .update(member)
            .set(member.username, "비회원")
            .where(member.age.lt(28))
            .execute();

    em.flush();
    em.clear();

    List<Member> result = queryFactory.selectFrom(member).fetch();
    for (Member member1 : result) {
        System.out.println(member1);
    }
}
@Test
@DisplayName("기존 숫자에 1더하기")
public void test11() throws Exception {
    long count = queryFactory
            .update(member)
            .set(member.age, member.age.add(1))
            .execute();
}


쿼리 한번으로 대량 데이터 삭제

@Test
@DisplayName("삭제")
public void test12() throws Exception {
        queryFactory.delete(member).where(member.age.gt(18)).execute();
}


SQL function 호출하기



SQL function 호출하기

@Test
@DisplayName("replace 함수 사용")
public void test13() throws Exception {

    String result = queryFactory
            .select(
                Expressions.stringTemplate(
                    "function('replace', {0}, {1}, {2})",
                    member.username, "member", "M"))
            .from(member)
            .fetchFirst();
    
}
@Test
@DisplayName("lower 함수 사용")
public void test14() throws Exception {

    List<String> result = queryFactory
            .select(member.username).from(member)
            .where(member.username.eq(Expressions.stringTemplate(
                    "function('lower',{0})",
                    member.username
            )))
            .fetch();

}

ansi 표준 함수들은 querydsl이 상당부분 내장하고 있기 때문에 아래처럼

작성해도 동일한 동작을 한다.

@Test
@DisplayName("lower 함수 사용")
public void test14() throws Exception {
    
    List<String> result = queryFactory
            .select(member.username).from(member)
            .where(member.username.eq(member.username.lower()))
            .fetch();
            
}