무슨 말인지 헷갈리니 직접 코딩 해보자!
쿼리문이 where m -> where m.id 로 변환되서 실행되었다.
m =엔티티 직접 사용시 해당 엔티티의 기본 키값(m.id) 실행
그러므로 엔티티를 직접 전달하거나 식별자(m,id) 를 직접 전달하거나 결과는 똑같다.
외래키값이라 헷갈릴수 있지만 첫번째 문장을 잘 생각 해보자.
-> JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기
본 키 값을 사용
해당엔티티(team) 의 기본 키값(team.id) 를 사용 한다는 뜻이다.
미리 이름을 정의해서 사용하는 JPQL
정적 쿼리
애플리케이션 로딩 시점에 쿼리를 검증
사용법은 예상한 대로다. ->해당 엔티티위에 애노테이션으로 설정해준뒤 createNamedQuery을 이용해 사용한다.
중요한 포인트는 애플리케이션 로딩 시점에 쿼리를 검증한다는 점이다. 쿼리문에서 오류가 나면 다 잡아준다.
쉽게 말하면 많은 양의 수정을 할때 사용한다.
왜 써야할까?
->JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL 실행
executeUpdate()
- 영속성 컨텍스트 1차캐시가 아닌 바로 DB에 적용 시킨다.
바로 DB에 적용시킨다?? 테스트를 해보자!
즉 1차캐시 값은 Flush (DB에 값반영) / Clear(1차캐시 비우기) 으로 0이다. 하지만 벌크연산으로 인해 DB값은 20으로 설정된것이다.
영속성 컨텍스트 와 DB의 값이 다르기 시작한다!
-> 벌크연산후 Clear() 로 영속성 컨텍스트를 지워주자
아니 그러면 벌크연산 할때마다 Clear()써줘야돼??? 너무 불편한데??
-> JPA 를 좀더 쉽게 사용하기위해 나온 Spring Data Jpa 에서는 @Modifying을 지원한다.
참고자료 : Spring Data JPA Reference