📦 Database/JPQL2023. 4. 16. 01:12JPQL Join & Fetch Join

💡 Join Inner Join 멤버 내부의 팀에 m.team으로 접근 팀이 없으면 조회가 안된다. SELECT m FROM Member m [INNER] JOIN m.team t // 1:N은 Fetch Type을 Lazy로 하는걸 잊지 말자 String query = "select m from Member m inner join m.temm t"; List result = em.createQuery(query, Member.class).getResultList(); Outer Join 팀이 없어도 멤버만 조회가 된다. SELECT m FROM MEMBER m LEFT [OUTER] JOIN m.team t String query = "select m from Member m left outer joi..

📦 Database/JPQL2023. 4. 16. 01:12JPQL 경로 표현식

💡 JPQL 경로표현식 .(점)을 찍어 객체 그래프를 탐색하는 것 select m.username // 상태 필드 from Member m join m.team t // 단일 값 연관 필드 join m.orders o // 컬렉션 값 연관 필드 where t.name = 'teamA'; 상태 필드 단순히 값을 저장하기 위한 필드 연관 필드 연관관계를 위한 필드 단일 값 연관 필드 : 대상이 Entity이다. (N:1, 1:1) 컬렉션 값 연관 필드 : 대상이 Collection이다. (1:N, N:M) 특징 묵시적 내부 조인이 발생하는 단일 값 연관 경로, 컬렉션 값 연관 경로는 조심해서 사용해야 한다. 내부적으로 inner join문이 나가기 때문에 쿼리튜닝이 어렵기 때문에, 왠만하면 명..

📦 Database/JPQL2023. 4. 16. 01:11JQPL 벌크 연산 & 엔티티 직접 사용

💡 벌크 연산 PK를 특정한 엔티티의 Update, Delete를 제외한 모든 Update, Delete 쿼리이다. 쿼리 한 번으로 여러 테이블의 Row를 변경한다. (Entity) executeUpdate()의 결과는 영향을 받은 Entity의 수를 반환한다. Insert 문을 Hibernate에서 지원한다. (insert into .. select) // 재고가 10개 미만인 Product의 Price를 쿼리 한 번으로 10% 인상 String qlString = "update Product p " + "set p.price = p.price * 1.1 " + "where p.stockAmount < :stockAmount"; int resultCount = em.createQuery(qlString..

📦 Database/JPQL2023. 4. 16. 01:11JQPL 다형성 쿼리 & 결과 조회 API

💡 다형성 쿼리 Type 조회 대상을 특정 하위 클래스로 한정할 수 있다. 예를 들어서 Item이 상위클래스이고 Book, Movie, Song 등 하위 클래스들이 있다고 가정한다. Item의 하위 클래스 중 Book, Movie만 조회해보자. String query = "select i from Item i where type(i) in (Book, Movie)"; Treat (JPA 2.1) 자바의 타입 캐스팅과 유사하다. 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용한다. FROM, WHERE, SELECT(Hibernate 지원)를 사용한다. 부모 타입의 다운캐스팅 예시 String query = "select i from Item i where treat(i as Book).aut..

📦 Database/JPQL2023. 4. 16. 01:03JPQL Named Query & Parameter Binding

💡 Named 쿼리 - 정적 쿼리 엔티티 클래스에 미리 정의해서 이름을 부여해두고 사용하는 JPQL 쿼리에 이름을 부여하며, 이름을 통해 쿼리를 불러오기가 가능하다. 어노테이션, XML에 정의 (XML이 항상 우선권을 가진다.) 어플리케이션 로딩 시점에 초기화 후 재사용 (SQL 로 파싱하여 쿼리를 캐싱함) 어플리케이션 로딩 시점에 쿼리를 검증 - 컴파일 타임 시 에러 발생으로 인해 디버깅 용이 보통 엔티티에 @NamedQuery보단 @Query가 사용하기 더 편하고 좋다. // 엔티티 클래스에 정의 @Entity @NamedQuery( name = "Member.findByUsername", query = "select m from Member m where m.username = :username")..

📦 Database/JPQL2023. 4. 16. 01:02JPQL Paging API

💡 페이징 API JPA는 페이징 API를 다음 두 API로 추상화 해뒀다. 조회 시작위치(0부터 시작) setFirstResult(int startPosition) 조회할 데이터 수 setMaxResults(int maxResult) 예시 모든 데이터 베이스의 방언이 동작한다. LIMIT & OFFSET은 MySQL 방언이다. hibernate.dialect를 Oracle12cDialect로 변경해주면 Oracle 방언인 rownum 3 depth 전략으로 페이징을 짠다. // Member Class에 toString()을 Override 해준다. for (int i=0, i

📦 Database/JPQL2023. 4. 16. 00:59JPQL Projection

💡 프로젝션 Select에 조회할 대상을 지정하는 것이다. 프로젝션의 대상은 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입)이다. 프로젝션 조회 대상은 전부 영속성 컨텍스트의 관리 대상이다. 엔티티 프로젝션(멤버 조회) SELECT m FROM Member m ... 결과는 멤버가 조회된다. 엔티티 프로젝션(멤버 안에 있는 팀 조회) SELECT m.team FROM Member m ... 결과는 멤버가 아닌 멤버의 팀이 결과로 조회된다. List result = em.createQuery("select m.team from Member m", Team.class) .getResultList(); // --- 쿼리 튜닝의 편리함을 위해 명시적 Join 형식으로 Join을 하는걸 ..

image