단순 조회
JPA를 사용하면 entity 객체를 중심으로 개발
JPQL : JPA에서 SQL을 추상화한 객체 지향 쿼리 언어
JPQL 어려움
TypeQuery: 반환 타입이 명확할 때 사용TypedQuery<Entity> query = em.createQuery("SELECT m FROM Entity m", Entity.class);Query: 반환 타입이 명확하지 않을 때 사용Query query = em.createQuery("SELECT m.username, m.age from Entity m");query.getResultList()query.getSingleResult()query.setParameter() 사용 SELECT m FROM Member m where m.username=:username query.setParameter("username", usernameParam);SELECT m FROM Member m where m.username=?1 query.setParameter(1, usernameParam);Query 타입으로 조회
query.getResultList() 사용 List resultList = em.createQuery("select m.name, m.age from Member m").getResultList();
Object o = resultList.get(0);
Object[] result = (Object[]) o;
Object[] 타입으로 조회
List<Object[]> resultList = em.createQuery("select m.name, m.age from Member m").getResultList();
Object[] result = resultList.get(0);
new 명령어로 조회
SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m
setFirstResult(int startPosition) : 조회 시작 위치setMaxResults(int maxResult) : 조회할 데이터 수SELECT m FROM Member m [INNER] JOIN m.team tSELECT m FROM Member m LEFT [OUTER] JOIN m.team tselect count(m) from Member m, Team t where m.username= t.nameSELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'A'SELECT m, t FROM
Member m LEFT JOIN Team t on m.username = t.name쿼리 내부에 한번 더 쿼리
지원 함수
EXISTS : 결과가 존재 -> 참ALL : 모두 만족 -> 참ANY, SOME : 하나라도 만족 -> 참IN : 하나라도 같은 것이 존재 -> 참JPA 서브 쿼리 한계
문자 : ‘HELLO’, ‘She’’s’숫자 : 10L(Long), 10D(Double), 10F(Float)Boolean : TRUE, FALSEENUM : jpabook.MemberType.Admin (패키지명 포함)entity 타입 : TYPE(m) = Member (상속 관계에서 사용)select
case when m.age <= 10 then '학생요금' when m.age >= 60 then '경로요금'
else '일반요금'
end
from Member mselect
case t.name
when '팀A' then '인센티브110%'
when '팀B' then '인센티브120%'
else '인센티브105%'
end
from Team tCOALESCE : 하나씩 조회해서 null이 아니면 반환select coalesce(m.username,'이름 없는 회원') from Member mNULLIF : 두 값이 같으면 null 반환, 다르면 첫번째 값 반환select NULLIF(m.username, '관리자') from Member mfunction('function name')join fetch 사용TYPE : 조회 대상을 특정 자식으로 한정TREAT 미리 정의해서 이름을 부여해두고 사용하는 JPQL
정적 쿼리
어노테이션, XML에 정의
애플리케이션 로딩 시점에 초기화 후 재사용
애플리케이션 로딩 시점에 쿼리를 검증 -> 어노테이션에 등록되기에 문법 오류가 날 경우 알려줌.
우선 순위는 XML -> 어노테이션
executeUpdate()를 사용