JPQL - JPQL 기본(3)
"인프런 - 자바 ORM 표준 JPA 프로그래밍 강의를 듣고 작성한 글 입니다."
www.inflearn.com/course/ORM-JPA-Basic#
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그
www.inflearn.com
이번엔 프로젝션에서 한번에 여러 값을 조회해오는 경우를 알아보자.
1. Query 타입으로 조회, 2. Object[] 타입으로 조회, 3. new 명령어로 조회
1. Query 타입으로 조회하는 방법
아래의 링크를 참조하자.
evan-development.tistory.com/56?category=941005
JPQL - JPQL 기본(1)
"인프런 - 자바 ORM 표준 JPA 프로그래밍 강의를 듣고 작성한 글 입니다." JPQL(Java Persistence Query Language) - JPQL 은 객체지향 쿼리 언어이다, 따라서 테이블을 대상으로 쿼리를 하는 것이 아닌 Entity..
evan-development.tistory.com
2. Object[] 타입으로 조회하는 경우
아래의 코드를 살펴보면 JPQL 을 통해 리스트의 첫번째 요소로 가져온 여러 타입의 데이터를 새로 생성하는 Object 타입 배열에 넣은 후, 해당 배열에서 인덱스 값을 통해 데이터를 가져오는 것을 알 수 있다.
배열 인덱스에 데이터가 들어가는 기준은 JPQL 에서 앞쪽에 작성된 데이터의 순서이다.
- JpaMain.java
// 프로젝션에서 한번에 여러 타입의 값을 가져와야 할 경우
List<Object[]> resultList = em.createQuery("select m.username, m.age from Member m")
.getResultList();
Object[] result = resultList.get(0);
System.out.println("result = " + result[0]);
System.out.println("result = " + result[1]);
- Hibernate SQL
Hibernate:
/* select
m.username,
m.age
from
Member m */ select
member0_.username as col_0_0_,
member0_.age as col_1_0_
from
Member member0_
result = member1
result = 10
3. new 명령어로 조회하는 경우
- 가장 깔끔한 방법이다.
단순 값을 DTO 로 바로 조회하며 패키지 명을 포함한 전체 클래스 명을 입력해야 하고, 순서와 타입이 일치하는 생성자가 필요하다.
우선 MemberDTO 클래스를 생성한다.
- MemberDTO.java
public class MemberDTO { // 엔티티가 아니므로 @Entity 어노테이션은 사용하지 않는다.
private String username;
private int age;
public MemberDTO(String username, int age) {
this.username = username;
this.age = age;
} // JPQL 코드 작성을 위해 생성자를 만든다.
// Getter, Setter
}
- JpaMain.java
List<MemberDTO> result = em.createQuery("select new jpql.MemberDTO(m.username, m.age) from Member m", MemberDTO.class)
.getResultList(); // 마치 생성자를 통해 객체를 생성하는 것 처럼 JPQL 을 작성해준다.
MemberDTO memberDTO = result.get(0);
System.out.println("memberDTO = " + memberDTO.getUsername());
System.out.println("memberDTO = " + memberDTO.getAge());
- Hibernate SQL
Hibernate:
/* select
new jpql.MemberDTO(m.username,
m.age)
from
Member m */ select
member0_.username as col_0_0_,
member0_.age as col_1_0_
from
Member member0_
memberDTO = member1
memberDTO = 10
이 방식의 단점으로는 패키지명을 포함한 전체 클래스 명을 작성해줘야 하기 때문에 JPQL 코드가 지나치게 길어질 수 있다는 점이 있는데, 이는 후에 QueryDSL 을 사용하면 극복할 수 있다고 한다.
다음 글 에서는 페이징 기능에 대해 알아보자.