Named 쿼리 - 정적 쿼리
- 미리 정의해서 이름을 부여해두고 사용하는 JPQL
- 정적 쿼리
- 어노테이션, XML에 정의
- 애플리케이션 로딩 시점에 초기화 후 재사용
- 애플리케이션 로딩 시점에 쿼리를 검증
Member Entity
@Entity
@NamedQuery(
name="Member.findByUsername",
query="select m from Member m where m.username =:username"
// 만약 문제있는 쿼리라면 컴파일 시점에 에러를 내줌.
)
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
JpaMain
List<Member> resultList = em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", "user1")
.getResultList();
for (Member member : resultList){
System.out.println(member.getUsername());
}
벌크 연산
- 재고가 10개 미만인 모든 상품의 가격을 10% 인상하려면?
- JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL 실행
- 쿼리 한 번으로 여러 테이블 로우 변경(엔티티)
JpaMain
모든 member의 age가 20
Member member1 = new Member();
member1.setUsername("user1");
member1.setTeam(teamA);
em.persist(member1);
Member member2 = new Member();
member2.setUsername("user2");
member2.setTeam(teamA);
em.persist(member2);
Member member3 = new Member();
member3.setUsername("user3");
member3.setTeam(teamB);
em.persist(member3);
// flush 자동 호출
int resultCount = em.createQuery("update Member m set m.age = 20 ").executeUpdate();
System.out.println("reulstCount= "+resultCount); // 3
System.out.println("member1 age = " + member1.getAge()); // member1 age = 0
벌크 연산 주의
- 벌크 연산은 영속성 컨텍스트를 무시하고 DB에 직접 쿼리
- 벌크 연산을 먼저 실행
- 벌크 연산 수행 후 영속성 컨텍스트 초기화
Member member1 = new Member();
member1.setUsername("user1");
member1.setTeam(teamA);
em.persist(member1);
Member member2 = new Member();
member2.setUsername("user2");
member2.setTeam(teamA);
em.persist(member2);
Member member3 = new Member();
member3.setUsername("user3");
member3.setTeam(teamB);
em.persist(member3);
// flush 자동 호출
int resultCount = em.createQuery("update Member m set m.age = 20 ").executeUpdate();
System.out.println("reulstCount= "+resultCount); // 3
em.clear(); // em.clear()가 없으면 아래 member1의 age는 그대로 0이다.
Member findMember = em.find(Member.class, member1.getId());
System.out.println("member1 age = " + member1.getAge()); // member1 age = 20
'JPA' 카테고리의 다른 글
[JPA API] 주문, 배송정보, 회원 조회 API (0) | 2024.01.24 |
---|---|
[JPA API] 간단한 회원 등록, 수정, 조회 API (1) | 2024.01.23 |
[JPQL] 경로 표현식, 페치 조인 (1) | 2024.01.22 |
[JPQL] 조건식, 기본 함수 (0) | 2024.01.20 |
[JPQL] 조인 (0) | 2024.01.19 |