JPA

JPQL - JPQL 기본(3)

방구석 대학생 2020. 11. 16. 17:36

"인프런 - 자바 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 을 사용하면 극복할 수 있다고 한다.

 

 

다음 글 에서는 페이징 기능에 대해 알아보자.