티스토리 뷰

이런 경우가 있다.

 

모든 직원의 연봉을 10% 인상해!

라는 경우이다.

 

이런 것을 벌크성 수정 쿼리라 한다.

 

이런 경우에는 db를 호출해서 로직을 짜는 것 보다, 업데이트 쿼리를 날리는 것이 효과 적인데 이걸 벌크성 수정 쿼리라 한다.

 

순수 JPA 업데이트

    public int bulkAgePlus(int age){
        int resultCount = em.createQuery("update Member m set m.age = m.age + 1 where m.age >= :age")
                .setParameter("age", age).executeUpdate();
        return resultCount;
    }

 

DataJPA 업데이트

    @Modifying
    @Query("update Member m set m.age = m.age + 1 where m.age >= :age")
    int bulkAgePlus(@Param("age")int age);

 

dataJPA로 할 때에는 @Modifying이 꼭 붙어야 한다.

여기서 조심해야 할 부분이 있다.

        memberRepository.save(new Member("member1" , 10));
        memberRepository.save(new Member("member2" , 19));
        memberRepository.save(new Member("member3" , 20));
        memberRepository.save(new Member("member4" , 21));
        memberRepository.save(new Member("member5" , 40));

        //where
        int resultCount = memberRepository.bulkAgePlus(20);

        List<Member> result = memberRepository.findByUsername("member5");
        Member member5 = result.get(0);
        System.out.println("member5 = " + member5);

 

dataJPA로 업데이트 할 경우 해당 코드의 result로 보면 age는 40로 잡힌다.

꼭 영속성 컨텍스트를 비워줘야한다 

 

    @Test
    public void bulkUpdate(){
        memberRepository.save(new Member("member1" , 10));
        memberRepository.save(new Member("member2" , 19));
        memberRepository.save(new Member("member3" , 20));
        memberRepository.save(new Member("member4" , 21));
        memberRepository.save(new Member("member5" , 40));

        //where
        int resultCount = memberRepository.bulkAgePlus(20);

        em.flush(); // 남은 쿼리를 모두 익스큐트한다.
        em.clear(); // 영속성 컨텍스트를 비운다. 이후에 JPA를 이용하면 다시 쿼리를 날려 조회 등이 작동된다.

        List<Member> result = memberRepository.findByUsername("member5");
        Member member5 = result.get(0);
        System.out.println("member5 = " + member5);

        //then
        Assertions.assertThat(resultCount).isEqualTo(3);
    }

 

    @Modifying(clearAutomatically = true)
    @Query("update Member m set m.age = m.age + 1 where m.age >= :age")
    int bulkAgePlus(@Param("age")int age);

 

혹은 이렇게 clearAutomatically를 true로 두면 위와 같은 상태가 된다.

 

 

'dev_공부일지 > spring data JPA' 카테고리의 다른 글

JPA Hint & Lock  (0) 2024.03.06
@EntityGraph  (0) 2024.03.06
변환 타입 (중요, null체크) , 페이징과 정렬  (0) 2024.03.05
@Query 값 DTO 조회하기 , 파라미터 바인딩  (0) 2024.03.05
JPA NamedQuery  (0) 2024.03.05
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함