본문 바로가기

jpa16

JPA 영속성 컨텍스트 주의점 1. 문제 발생 JPQL을 통해서 Designer를 조회할 때 fetch join을 통해서 OneToMany 관계를 맺고 있는 ReservationTime까지 정보를 가져오려고 시도하였다. 이때 Designer 정보는 잘가져오지만 Designer에 속하는 List 정보는 계속 size가 0인 문제가 발생하였다. 코드를 통해서 자세히 살펴보자. Entity @Entity @Getter @Table(name = "designer") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Designer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(.. 2022. 7. 17.
[JPA] JPQL - 벌크 연산 1. 벌크 연산 엔티티를 수정하려면 영속성 컨텍스트의 변경 감지 기능이나 병합을 사용하고, 삭제하려면 EntityManage.remove() 메서드를 사용한다. 하지만 이 방법으로 수백개 이상의 엔티티를 하나씩 처리하기에는 시간이 너무 오래 걸린다. 여러 건을 한 번에 수정하거나 삭제하는 벌크 연산을 사용한다. //모든 멤버의 나이를 20으로 수정한다. int resultCount = em.createQuery("update Member m set m.age = 20") .executeUpdate(); //10살 이상의 멤버를 모두 삭제한다. int resultCount = em.createQuery("delete from Member m where m.age > 10") .executeUpdate();.. 2022. 1. 8.
[JPA] JPQL - Named 쿼리 (정적 쿼리) 1. 동적 쿼리 vs 정적 쿼리 (1) 동적 쿼리 em.createQuery("select ..")처럼 JPQL을 문자로 완성해서 직접 넘기는 것을 동적 쿼리라 한다. 런타임에 특정 조건에 따라 JPQL을 동적으로 구성할 수 있다. (2) 정적 쿼리 미리 정의한 쿼리에 이름을 부여해서 필요할 때 사용할 수 있는데 이것을 Named 쿼리라 한다. Named 쿼리는 한 번 정의하면 변경할 수 없는 정적인 쿼리이다. 2. 정적 쿼리 특징 애플리케이션 로딩 시점에 JPQL 문법을 체크하고 미리 파싱한다. 로딩 시점에 쿼리를 검증하므로 오류를 빠르게 확인할 수 있다. 사용하는 시점에는 파싱 된 결과를 재사용하므로 성능상 이점이 있다. 변하지 않는 정적 SQL이 생성되므로 데이터베이스의 조회 성능 최적화에 도움이 .. 2022. 1. 8.
[JPA] JPQL - 조건식 1. 타입 표현 JPQL에서 사용하는 타입은 대소문자를 구분하지 않는다. 종류 설명 예제 문자 작은 따옴표 사이에 표현 작은 따옴표를 표현하고 싶으면 작은 따옴표 연속 두 개('') 사용 'HELLO' "She''s ' 숫자 L(Long 타입 지정) D(Double 타입 지정) F(Float 타입 지정) 10L 10D 10F 날짜 DATE {d 'yyyy-mm-dd'} TIME {t 'hh-mm-ss'} DATETIME {ts 'yyyy-mm-dd hh:mm:ss.f'} {d '2012-03-24'} {t '10-11-11'} {ts '2012-03-24 10-11-11.123'} m.createDate = {d '2012-03-24'} Boolean TRUE, FALSE Enum 패키지명을 포함한 전체.. 2022. 1. 8.
[JPA] JPQL - 경로 표현식(Path Expression)과 묵시적 조인 1. 경로 표현식이란? .(점)을 찍어 객체 그래프를 탐색하는 것이다. select m.username from Member m join m.team t where t.name = "teamA" m.username, m.team, t.name 모두 경로 표현식을 사용한다. 2. 경로 표현식의 종류 (1) 상태 필드(state field) 단순히 값을 저장하기 위한 필드(or 프로퍼티) (2) 연관 필드(association field) 연관관계를 위한 필드, 임베디드 타입 필드(or 프로퍼티) (i) 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티 (ii) 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션 @Entity @Getter @Se.. 2022. 1. 7.
[JPA] JPQL - 페치 조인(Fetch Join) 1. 페치 조인 (Fetch Join) SQL 조인 종류가 아니다. JPQL에서 성능 최적화를 위해 제공하는 기능이다. 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능을 한다. (지연 로딩을 무시한다.) join fetch 명령어 사용 페치 조인은 별칭을 사용할 수 없다. 하이버네이트는 페치 조인에도 별칭을 허용한다. 페치 조인 ::= [LEFT [OUTER] | INNER ] JOIN FETCH 조인 경로 2. 페치 조인과 일반 조인의 차이 (1) 일반 조인 //일반 조인 String query = "select m from Member m join m.team t"; JPQL은 결과를 반환할 때 연관관계를 고려하지 않는다. 회원과 팀을 조인했으므로 팀이 함께 조회할 것으로 기대해선 안된다.. 2022. 1. 7.
반응형