본문 바로가기
개발/JPA

[JPA] Hibernate Query Language(HQL) Projection / 하이버네이트 쿼리 언어 프로젝션 조회 / 특정 컬럼만 조회 / 예문

by Allonsy 2022. 4. 11.
반응형

하이버네이트쿼리(hql)로 조회를 해올 때 엔티티(전체 컬럼)조회와 특정 컬럼만 조회해오는 방법!!

# 엔티티 조회

entityManager.createQuery 로 select 를 해올 때 엔티티 기준으로 조회해오는 것은 쉽다

// Member 엔티티 조회
List<Member> entityList = 
	entityManager.createQuery("select m from Member m", Member.class).getResultList();

// Member의 Team 엔티티 조회
List<Team> teamEntityList = 
	entityManager.createQuery("select m.team from Member m", Member.class).getResultList();
List<Team> teamEntityListByJoin =
	entityManager.createQuery("select t from Member m join m.team t", Member.class).getResultList();

 

# 특정 컬럼만 조회

1. Object

createQuery에서 type을 지정해주지 않으면 Object List를 결과로 받는다

Object를 Object[]로 캐스팅해준 후, 순서대로 꺼내서 사용해야한다(불편)

List objectResult = 
	entityManager.createQuery("select m.username, m.age from Member m").getResultList();
for (Object o : objectResult) {
    Object[] item = (Object[]) o;
    String username = (String) item[0];
    int age = (int) item[1];
}

2. Object[]

Object배열 리스트로 결과를 받는다

캐스팅해줄 필요가 없어서 Object로 받는 것보다는 아주 조금 간편. 코드를 한 줄 줄일 수 있다

List<Object[]> objectArrList = 
	entityManager.createQuery("select m.username, m.age from Member m").getResultList();
for (Object[] objects : objectArrList) {
    String username = (String) objects[0];
    int age = (int) objects[1];
}
// 명시적으로 타입 적어줌
List<Object[]> objectArrList = 
	entityManager.createQuery("select m.username, m.age from Member m", Object[].class).getResultList();
for (Object[] objects : objectArrList) {
    String username = (String) objects[0];
    int age = (int) objects[1];
}

3. Tuple

Tuple 타입을 이용해서 결과를 받는다

컬럼에 alias를 지정해줄 경우 get(alias, 타입) 으로 꺼내서 사용할 수 있다

index를 이용하여 꺼내줄 경우 캐스팅을 해줘야한다

List<Tuple> tupleList = 
	entityManager.createQuery("select m.username as username, m.age as age from Member m", Tuple.class).getResultList();
for (Tuple tuple : tupleList) {
    // index
    String username = (String) tuple.get(0);
    int age = (int) tuple.get(1);
    // alias
    String usernameByAlias = tuple.get("username", String.class);
    int ageByAlias = tuple.get("age", Integer.class);
}

4. DTO

DTO 를 만든 후 생성자를 이용해서 반환 받는다

DTO 의 패키지명을 모두 정확하게 작성해야 하는 것을 주의한다

List<MemberDTO> dtoList = em.createQuery("select new jpql.MemberDTO(m.username, m.age) from Member m", MemberDTO.class).getResultList();
for (MemberDTO memberDTO : dtoList) {
    String username = memberDTO.getUsername();
    int age = memberDTO.getAge();
}

 

[참고] 하이버네이트 공식 문서

distinct, aggregate function(통계) 등의 자세한 문법도 공식문서에 잘 나와있다 :)

https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html#hql-select-clause

 

Hibernate ORM 6.0.0.Final User Guide

Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat

docs.jboss.org

 

반응형

댓글