카테고리 없음

querydsl 벌크연산, sql함수를 querydsl로 변환.

하얀잔디 2022. 8. 23. 12:19

회워중에 나이가 28살 이하인 회원들은 모두 이름을 "비회원" 으로 처리하고싶을떄,

 

@Test
@DisplayName("")
@Commit
void Bulkupdate() throws Exception {
    //given
    long count = queryFactory
            .update(member)
            .set(member.username, "비회원")
            .where(member.age.lt(28))
            .execute();

이런식으로 하면 count에는 영향을 받은 칼럼의 갯수가저장이 된다.

주의할 점

 

영속성 컨텍스트는 "비회원"으로 바뀌기 전으로 남아있고,

DB에는 "비회원" 으로 바꾸기때문에, 불일치가 생길 수 있음.

 

만약 update 하고 나서 select를 바로 하면,

--> DB보다 영속성 컨텍스트가 우선이기 때문에, 영속성 컨텍스트에 있는 내용이 우선적으로 된다.

 

따라서 

 

수정 후 바로 em.flush(),em.clear()을 하는게 좋다!

 

그래야 영속성 컨텍스트의 값과 DB의 값이 같아짐.

 

---

값을 더하기/곱하기 하고싶으면

 

.set(member.age, member.age.add(1))

식으로 하면 됨.

 

 

오라클에는 replace 함수가 있다.
 replace(컬럼명, '찾을문자', '변환문자')

replace 함수를 사용해서 특정문자 치환, 공백제거 , 탭 제거 등 그런 거를 쉽게 할 수 있다.

 

 

이를 querydsl에서도 자바 코드로 쓸 수 있다.

 

 

 

 

만약 DB에서 함수를 쓰고싶으면 H2Dialect를 상속받아서 구현하면 됨. (그럴일이 있을까??)