목록JPA (52)
BE전문가 프로젝트
- 재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면? - JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL 실행 `1. 재고가 10개 미만인 상품을 리스트로 조회한다. 2. 상품 엔티티의 가격을 10% 증가한다. 3. 트랜잭션 커밋 시점에 변경감지가 동작한다. - 변경된 데이터가 100건이라면 100번의 Update SQL 실행 벌크 연산은 한번에 UPDATE, DELETE, INSERT(하이버네이트) 한 번에 여러가지 동작을 실행하는 것이다 벌크 연산 예제 쿼리 한 번으로 여러 테이블 로우 변경(엔티티) executeUpdate()의 결과는 영향을 받은 엔티티 수 반환 UPDATE, DELETE 지원 INSERT(insert into ... select. 하이버네이트 지원 Member ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/c6ltq3/btrQV0OuV3x/lLLfEY4ekMrY6JigLf1Xe1/img.png)
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..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/2dhRK/btrQSFZWje8/T1hcYwTT3rHryhjNQ1Mam1/img.png)
엔티티 직접 사용 - 기본 키 값 - 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 값..
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 사용
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dwjCcO/btrQMtegGz2/a6w24h22kPyZo90VLIeq61/img.png)
페치 조인의 특징과 한계 - 페치 조인 대상에는 별칭을 줄 수 없다. 하이버네이트는 가능, 가급적 사용 X 페치 조인 대상에 별칭을 주어 where절에 사용이 불가능하다. 데이터중 몇개의 데이터만 따로 조작하는 것은 매우 위험함 - 둘 이상의 컬렉션은 페치 조인 할 수 없다. 일대다대다 관계가 나오기 때문에 데이터가 정말 예상하지 못하게 늘어나면서 문제가 생긴다. - 컬렉션을 페치 조인하면 페이징 API(setFirstResult, setMaxResults)를 사용할 수 없다. 일대일, 다대일 같은 단일 값 연관 필드들은 페치 조인해도 페이징 가능 하이버네이트는 경고 로그를 남기고 메모리에서 페이징(매우 위험) 페이징 해결법 일대다 관계를 뒤집어 다대일로 fetchJoin을 한다. fetchjoin을 해..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/CjsUk/btrQORdQCEs/yQTDF77TDZ7YMSJ8EyCtl0/img.png)
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 즉시로딩과 같지만 쿼리로 원하는 데로 객체 그래프를 한번에 조회할 것이라는 것을 명시적으로 동적인 타이밍에 정..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/RP2ry/btrQGSFbZHE/GvUMYErY80Vj93VUMIKcEK/img.png)
.(점)을 찍어 객체 그래프를 탐색하는 것 String query = "select m.team from Member m"; 상태필드: 단순히 값을 저장하기 위한 필드 연관필드: 연관관계를 위한 필드 단일 값 연관 필드 @ManyToOne, @OneToOne, 대상이 엔티티(m.team) 컬렉션 값 연관 필드 @OneToMany, @ManyToMany, 대상이 컬렉션(m.orders) 경로 표현식 특징 상태 필드(state field): 경로 탐색의 끝, 탐색X 단일 값 연관 경로: 묵시적 내부 조인(inner join) 발생, 탐색O 컬렉션 값 연관 경로: 묵시적 내부 조인 발생, 탐색X - from절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색 가능 상태필드 String query = "s..
JPQL 기본 함수 CONCAT SUBSTRING TRIM LOWER, UPPER LENGTH LOCATE ABS, SQRT, MOD SIZE, INDEX(JPA용도) 사용자 정의 함수 하이버네이트는 사용전 방언에 추가해야한다. 사용하는 DB방언을 상속 받고, 사용자 정의 함수를 등록한다. SELECT function('group_concat', i.name) from Item i 각각의 DB에서 사용하는 함수들은 대부분 JPA에 등록이 되어있기 때문에 찾아보고 사용이 가능하다. 따라서 등록되어있지 않은 함수들은 위에서 사용한것 처럼 따로 정의를 해줘야 한다. package dialect; import org.hibernate.dialect.MySQL8Dialect; import org.hibernate..