하이버네이트쿼리(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(통계) 등의 자세한 문법도 공식문서에 잘 나와있다 :)
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
'개발 > JPA' 카테고리의 다른 글
[JPA] 지연로딩과 조회 성능 최적화 1 - xToOne (0) | 2022.04.18 |
---|---|
[JPA] JPQL fetch join / 연관된 entity 한번에 select / distinct로 엔티티 중복 제거 / fetch join 페이징 안 될 때 @BatchSize 설정 (0) | 2022.04.12 |
[JPA] 연관관계 영속성 전이 CASCADE (0) | 2022.04.07 |
[JPA] 지연 로딩 LAZY , 즉시 로딩 EAGER (0) | 2022.04.06 |
[JPA] 프록시 (0) | 2022.04.06 |
댓글