아래는 김영한 강사님의 스프링 JPA 표준 강의를 듣고 정리한 내용이다.
select m from Member m where m.age>(select avg(m2.age) from Member m2)
이 경우 m2 를 새로 정의 해서 성능이 잘 나온다. 하지만
select m from Member m where (
select count(o) from Order o where m=o.member)>0
이 경우 m을 긁어오기에 성능 안나올수 있다.
select m from Member m where
exists (select t from m.team t where t.name='팀A')
select o from Order o
where o.orderAmount>ALL(select p.stockAmount from Product p)
select m from Member m
where m.team=ANY(select t from Team t)
String query="select m.username,'hello', true FROM Member m";
List<Object[]> result=...
Object[0]:유저이름,Object[1]:Hello,Object[2]:true 들어간다
where m.type=jpql(클래스).MemberType(클래스명).Admin;
"select i from Item i where type(i)=Book",Item.class)
type이 book인 것만 추출한다
select
case when m.age <= 10 them '학생요금'
when m.age >= 60 then '경로요금'
else '일반요금'
end
from Member m
select coalesce(m.username,'이름 없는 회원') from Member m
username 없으면 이름 없는 회원으로 나온다.
select NULLIF(m.username,'관리자') from Member m
그래서 LAZY 를 쓰는데 조회할때 다른 Entity 의 값도 가져오려면 LAZY 타입이니 쿼리가 많이 나가서 fetch JOIN 으로 한 쿼리로 연결 시킨다.
그러면 EAGER 바꾸면 될 것같지만, EAGER 는 예측할 수 없는 문제도 있고, 다른곳에서 조회할때는 또 다른 엔티티의 값이 필요가 없을 수도 있기 때문에 기본은 LAZY로 해두고 다른 엔티티의 값이 필요한 특수한 경우에만 fetch JOIN 을 한다.
즉 객체 그래프를 동적으로 명시적으로 가지고 오고 싶을 때 fetch join 을 쓴다
N+1문제를 fetch join으로 해결가능하다
select t from Team t join fetch t.members
이러면 데이터베이스 테이블을 따라서 memberID랑 Name만 다른 것을 다른 컬럼으로 본다
같은 식별자를 가진 Team 엔티티를 제거하려면 distinct를 써주면 된다
select i from Item i where type(i) IN (BOOk,Movie)//Item 중 Book,Movie를 조회해라
상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 떄
select i from Item i where treat(i as Book).author='kim'
int resultCount=em.createQuery("update Member m st m.age=20").executeUpdate();
1)벌크 연산을 먼저 실행하거나
2)벌크 연산 수행 후 영속성 컨텍스트를 초기화한다