본문 바로가기
728x90

[JAVA]/JPA35

JPQL - fetch join ferch join SQL 조인의 종류가 아니다. JPQL에서 성능 최적화를 위해 제공하는 기능이다. 연관된 엔티티나 컬렉션을 SQL 쿼리 한 번으로 함께 조회할 수 있는 기능이다. join fetch라는 명령어를 사용한다. -- 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 컬렉션의 fetch join 일대다 관계의 컬렉션 fetch join의 경우 데이터가 뻥튀기될 수 있다. -- JQPL select t from Team t join fetch t.members where t.name = '팀A' -- SQL SELECT T.*, .. 2023. 5. 13.
JPQL - 경로 표현식 경로표현식 .(점)을 찍어 객체 그래프를 탐색하는 것을 말한다. SELECT m.username -- > 상태 필드 FROM Member m JOIN m.team t -- > 단일 값 연관 필드 JOIN m.orders o -- > 컬렉션 값 연관 필드 WHERE t.name = '팀A' 용어 정리 상태 필드(state field) 단순히 값을 저장하기 위한 필드 ex) m.username 연관필드(association field) 연관관계를 위한 필드 단일 값 연관 필드 @ManyToOne, @OneToOne 대상이 엔티티(ex: m.team) 컬렉션 값 연관 필드 @OneToMany, @ManyToMany 대상이 컬렉션(ex: m.orders) 명시적 조인 join 키워드를 직접 사용하는 것을 말한다.. 2023. 5. 4.
JPQL 함수 JPQL 기본 함수 JPQL에서 제공하는 표준 함수로 데이터베이스에 관계없이 쓸 수 있다. CONCAT SUBSTRING TRIM LOWER, UPPER LENGTH LOCATE ABS, SQRT, MOD SIZE, INDEX(JPA 용도) 사용자 정의 함수 호출 하이버네이트는 사용 전 방언에 추가해야한다. 사용하는 DB 방언을 상속받고, 사용자 정의 함수를 등록한다. 참고 김영한 - 자바 ORM 표준 JPA 프로그래밍 2023. 5. 3.
JPQL 조건식 - CASE 식 기본 CASE 식 -- 기본 CASE 식 SELECT CASE WHEN m.age = 60 THEN '경로요금' else '일반요금' END FROM Member m -- 단순 CASE 식 SELECT CASE t.name WHEN '팀A' THEN '인센티브110%' WHEN '팀B' THEN '인센티브120%' ELSE '인센티브105%' END FROM Team t -- COALESCE : 하나씩 조회해서 null이 아니면 반환 SELECT COALESCE(m.username, '이름 없는 회원') FROM Member m -- 사용자 이름이 없으면 이름 없는 회원을 반환 -- NULLIF : 두 값이 같으면 null 반환, 다르면 첫번째 값 반환 SELECT NULLIF(m.username, '관.. 2023. 5. 3.
JPQL - 타입 표현과 기타식 JPQL 타입 표현 문자 'HELLO', 'SHE''s' 숫자 10L(Long), 10D(Double), 10F(Float) Boolean TRUE, FALSE ENUM jpabook.MemberType.Admin (패키지명 포함) 엔티티 타입 TYPE(m) = Member (상속 관계에서 사용) JPQL 기타식 SQL과 문법이 같은 식 EXISTS, IN AND, OR, NOT =, >, >=, 2023. 5. 1.
JPQL - 서브 쿼리 서브쿼리 Example 나이가 평균보다 많은 회원 SELECT m FROM Member m WHERE m.age > (SELECT avg(m2.age) FROM Member m2) 한 건이라도 주문한 고객 SELECT m FROM Member m WHERE (SELECT count(o) FROM Order o WHERE m = o.member) > 0 서브 쿼리 지원 함수 [NOT] EXISTS (subquery) 서브쿼리에 결과가 존재하면 참 {ALL | ANY | SOME} (subquery) ALL : 모두 만족하면 참 ANY, SOME : 같은 의미, 조건을 하나라도 만족하면 참 [NOT] IN (subquery) 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참 Example 팀 A 소속인 회원.. 2023. 5. 1.
JPQL - JOIN 내부 조인 SELECT m FROM Member m [INNER] JOIN m.team t 외부 조인 SELECT m FROM Member m LEFT [OUTER] JOIN m.team t 세타 조인 SELECT count(m) FROM Member m, Team t WHERE m.username = t.name FROM Member m, Team t로 하면 카테시안 곱으로 전부 곱한 테이블에서 WHERE 절의 조건에 맞는 데이터가 필터링된다. ON 절 ON 절을 활용한 조인 조건 추가(JPA 2.1부터 지원) 1. 조인 대상 필터링 예) 회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인 JPQL SELECT m, t FROM Member m LEFT JOIN m.team t ON t.name = '.. 2023. 5. 1.
JPQL - 페이징 API 페이징 API JPA는 페이징을 다음 두 API로 추상화한다. setFirstResult(int startPosition) 조회 시작 위치 setMaxResult(int maxResult) 조회할 데이터 수 -- MYSQL SELECT M.ID AS ID, M.AGE AS AGE, M.TEAM_ID AS TEAM_ID, M.NAME AS NAME FROM MEMBER M ORDER BY M.NAME DESC LIMIT ?, ? -- Oracle SELECT * FROM ( SELECT ROW_.*, ROWNUM ROWNUM_ FROM ( SELECT M.ID AS ID M.AGE AS AGE, M.TEAM_ID AS TEAM_ID, M.NAME AS NAME FROM MEMBER M ORDER BY M>.. 2023. 5. 1.
728x90