반응형
하이버네이트쿼리(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(통계) 등의 자세한 문법도 공식문서에 잘 나와있다 :)
반응형
'개발 > 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 |
댓글