엔티티 객체를 조회하는 객체지향 쿼리.
테이블 대상으로 쿼리하는게 아닌, 엔티티 객체를 대상으로 쿼리.
JPQL은 SQL로 변환됨.
JPA에서 제공하는 메소드 호출만으로 섬세한 쿼리 작성이 어렵다는 문제에서 JPQL 탄생.
JPQL을 실행하려면 쿼리 객체 생성해야함.
쿼리 객체 - TypedQuery, Query
public static void typedQuery(EntityManager em) {
String jpql = "select m form Member m "
TypedQuery<Member> query = em.createQuery(jpql, Member.class);
List<Member> list = query.getResultList();
for(Member member : list) {
System.out.println("Member : " + member);
}
}
-> EntityManager 객체에서 createQuery() 메소드를 호출 시 쿼리 생성
em.createQuery 메소드를 호출 시 두번째 인자로 엔티티 클래스 넘김.
public static void query(EntityManager em) {
String jpql = "select m.name, m.age from Member m";
Query query = em.createQuery(jpql);
List<Object> list = query.getResultList();
for(Object object : list) {
Object[] results = (Object[]) object;
for(Object result : results) {
System.out.print(result);
}
System.out.println();
}
}
-> Query 타입은 데이텉 검색 결과의 타입 명시 X
두 코드의 치아는 쿼리 객체의 타입의 차이가 있다.
TypedQuery<Member 를 사용시 쿼리 실행 결과를 명시적으로 Member 엔티티 객체로 받을 수 있어 형변환이 필요하지 않다.
결과 리스트를 바로 List<Member 로 받고, for each 루프에서 바로
Member 객체를 바로 출력할 수 있다.
Query 객체를 생성한 것은, 반환된 결과를 형변환해서 사용해야한다.
JPQL에서 성능 최적화를 위해 제공하는 기능.
연관된 엔티티나 컬렉션을 한 번에 같이 조회하는 기능
join fetch 명령어로 사용.
패치조인을 사용하면 SQL 한 번으로 연관된 엔티티를 함께 조회할 수 있어 SQL 호출 횟수를 줄여 성능 최적화 가능