JPQL 벌크 연산
·
JPA
- 재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면? - JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL 실행 `1. 재고가 10개 미만인 상품을 리스트로 조회한다. 2. 상품 엔티티의 가격을 10% 증가한다. 3. 트랜잭션 커밋 시점에 변경감지가 동작한다. - 변경된 데이터가 100건이라면 100번의 Update SQL 실행 벌크 연산은 한번에 UPDATE, DELETE, INSERT(하이버네이트) 한 번에 여러가지 동작을 실행하는 것이다 벌크 연산 예제 쿼리 한 번으로 여러 테이블 로우 변경(엔티티) executeUpdate()의 결과는 영향을 받은 엔티티 수 반환 UPDATE, DELETE 지원 INSERT(insert into ... select. 하이버네이트 지원 Member ..
Named쿼리
·
JPA
Named쿼리 - 정적 쿼리 미리 정의해서 이름을 부여해두고 사용하는 JPQL 정적 쿼리 어노테이션, XML에 정의 애플리케이션 로딩 시점에 초기화 후 재사용 애플리케이션 로딩 시점에 쿼리를 검증 엔티티에 미리 선언해두는 쿼리 정적쿼리는 동적쿼리와 다르게 변하지 않는 다는 특징을 가지고 있다. 애플리케이션 로딩 시점에 sql로 파싱을 하여 캐싱을 한다. @Entity@Getter@Setter @NamedQuery(name = "Member.findByUsername", query = "select m from MemberQQQ m where m.username = :username") List result = em.createNamedQuery("Member.findByUsername", Member.c..
엔티티 직접 사용
·
JPA
엔티티 직접 사용 - 기본 키 값 - JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용(엔티티를 식별할 수 있는 것은 기본키 이 기 때문) JPQL select count(m.id) from Member m//엔티티의 아이디를 사용 select count(m) from Member m //엔티티를 직접 사용 SQL(JPQL 둘다 같은 다음 SQL 실행) select couunt(m.id) as cnt from Member m 위의 메소드 두개를 실행해보면 SQL쿼리가 같은 것이 나간다. 그 이유는 엔티티 자체를 식별 할 수 있는 것은 기본키 이기 때문이다. 엔티티 직접 사용 - 외래 키 값 엔티티를 직접 사용하게 되면 mappedBy 에 설정한 값을 넣어준다. 보통 id 값..
다형성 쿼리
·
JPA
TYPE - 조회 대상을 특정 자식으로 한정 - 예) Item 중에 Book, Movie를 조회해라 [JPQL] select i from Iteam i where type(i)In (Book, Movie) [SQL] select i from i where i.DTYPE in ('B','M') TREAT 자바의 타입 캐스팅과 유사 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용 FROM, WHERE, SELECT 사용
페치조인의 한계
·
JPA
페치 조인의 특징과 한계 - 페치 조인 대상에는 별칭을 줄 수 없다. 하이버네이트는 가능, 가급적 사용 X 페치 조인 대상에 별칭을 주어 where절에 사용이 불가능하다. 데이터중 몇개의 데이터만 따로 조작하는 것은 매우 위험함 - 둘 이상의 컬렉션은 페치 조인 할 수 없다. 일대다대다 관계가 나오기 때문에 데이터가 정말 예상하지 못하게 늘어나면서 문제가 생긴다. - 컬렉션을 페치 조인하면 페이징 API(setFirstResult, setMaxResults)를 사용할 수 없다. 일대일, 다대일 같은 단일 값 연관 필드들은 페치 조인해도 페이징 가능 하이버네이트는 경고 로그를 남기고 메모리에서 페이징(매우 위험) 페이징 해결법 일대다 관계를 뒤집어 다대일로 fetchJoin을 한다. fetchjoin을 해..
JPQL - 페치 조인(fetch join)
·
JPA
SQL 조인 종류X JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능 join fetch 명령어 사용 페치ㅣ 조인 ::=[LEFT[OUTER] | INNER] JOIN FETCH 엔티티 페치 조인 회원을 조회하면서 연관된 팀도 함께 조회(SQL 한 번에) SQL을 보면 회원 뿐만 아니라 팀(T.*)도 함께 SELECT [JPQL] - select m from Member m join fetch m.team [SQL] - select M.*, T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID = T.ID 즉시로딩과 같지만 쿼리로 원하는 데로 객체 그래프를 한번에 조회할 것이라는 것을 명시적으로 동적인 타이밍에 정..
BE전문가 프로젝트
'JPA' 카테고리의 글 목록