분류 전체보기 1341

Ch11. 객체지향 쿼리 언어2(중급 문법) - 엔티티 직접 사용

엔티티 직접 사용 - 기본 키 값 JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본키 값을 사용 JPQL select count(m.id) from Member m //엔티티의 아이디를 사용 select count(m) from Member m //엔티티를 직접 사용 SQL ( JPQL 둘 다 같은 SQL을 실행한다) select count(m.id) as cnt from Member m 엔티티를 식별하는 것은 기본키이기 때문에 기본키 값을 사용한다. 엔티티를 파라미터로 전달 식별자를 직접 전달 파라미터로 전달하나 식별자를 직접 전달하나 실행되는 SQL 은 같다. select m.* from Member m where m.id=? 엔티티 직접 사용 - 외래 키 값 실행된 SQL selec..

Ch11. 객체지향 쿼리 언어2(중급 문법) - 다형성 쿼리

TYPE JPQL select i from Item i where type(i) IN (Book, Movie) SQL select i from i where i.DTYPE in (‘B’, ‘M’) 조회 대상을 특정 자식으로 한정 예) Item 중에 Book, Movie를 조회해라 TREAT JPQL select i from Item i where treat(i as Book).auther = ‘kim’ SQL select i.* from Item i where i.DTYPE = ‘B’ and i.auther = ‘kim’ 자바의 타입 캐스팅과 유사 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용 FROM, WHERE, SELECT(하이버네이트 지원) 사용 예) 부모인 Item과 자식 Book..

Ch11. 객체지향 쿼리 언어2(중급 문법) - 페치 조인(한계)

페치 조인의 특징과 한계 페치 조인 대상에는 별칭을 줄 수 없다. 하이버네이트는 가능, 가급적 사용 X 둘 이상의 컬렉션은 페치 조인할 수 없다. 1-다-다로 되기 때문에 데이터 적합성이 안 맞을 수가 있다. 컬렉션을 페치 조인하면 페이징 API(setFirstResult, setMaxResults)를 사용할 수 없다. 일대일, 다대일 같은 단일 값 연관 필드들은 페치 조인해도 페이징 가능 하이버네이트는 경고 로그를 남기고 메모리에서 페이징(매우 위험) 하이버 네이트 경고 에러가 뜬다 why? 일대다 페치조인같은경우 데이터가 뻥튀기되어 기준을 어디로 페이징을 해야 할지 정할 수 없다. 해결 방법 방향을 뒤집어서 일대다를 다대일로 변경해서 해결 BatchSize를 사용해서 in 절로 여러 개를 가지고 와서..

Ch11. 객체지향 쿼리 언어2(중급 문법) - 페치 조인(기본)

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 페치 조인 사용하기 Test Team teamA = new Team(); teamA.setName("teamA"); em...

Ch11. 객체지향 쿼리 언어2(중급 문법) - 경로 표현식

.(점)을 찍어 객체 그래프를 탐색하는 것 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) 상태 필드(state field): 경로 탐색의 끝, 탐색 X 단일 값 연관 경로:..

Ch10. 객체지향 쿼리 언어1(기본 문법) - JPQL 함수

JPQL 기본 함수 Concat 문자열을 합해준다. SubString 문자열을 잘라준다 Trim 문자열에 Trim 적용(좌우 양끝 공백을 제거) Lower, Upper 문자열을 대문자, 소문자로 출력 Length 문자열을 길이를 반환 Locate 첫 번째 파라미터가 몇 번째에 있는지 반환 없을 경우 0 반환 Abs, Sqrt, Mod 수학적 함수( 절대값, 제곱근, 나머지...) Size, Index(JPA 용도) Size를 가지고 오는 함수(List, Set, Map...) 사용자 정의 함수 호출 Test 하이버네이트는 사용 전 방언에 추가해야 한다. 사용하는 DB 방언을 상속받고, 사용자 정의 함수를 등록한다 DB방언에 함수를 추가해 주어야 된다(다행히도, 하이버네이트에 DB종속적이 함수들이 등록되어..

Ch10. 객체지향 쿼리 언어1(기본 문법) - 조건식(CASE 등등)

기본 CASE 식 select case when m.age = 60 then '경로요금' else '일반요금' end from Member m 기본 Case 식으로 age = 60 일 때 경로 요금, 그 외 일반요금을 프로젝션으로 출력한다. 단순 CASE 식 select case t.name when '팀A' then '인센티브110%' when '팀B' then '인센티브120%' else '인센티브105%' end from Team t 조건식 - CASE 식 COALESCE: 하나씩 조회해서 null이 아니면 반환 select coalesce(m.username,'이름 없는 회원') from Member m username값이 null이 아니면 이름없는회원으로 출력 NULLIF: 두 값이 같으면 nu..

Ch10. 객체지향 쿼리 언어1(기본 문법) - 서브 쿼리

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 (su..

Ch10. 객체지향 쿼리 언어1(기본 문법) - 조인

조인의 종류 내부 조인: 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 연관관계가 없는 테이블끼리의 조인 조인 - ON 절 ON 절을 활용한 조인(JPA 2.1부터 지원) 1. 조인 대상 필터링 2. 연관 관계없는 엔티티 외부 조인(하이버네이트 5.1부터)