JPA

[JPA] 22. JPQL - 기본 문법 2

inuma 2021. 1. 27. 23:45
프로젝트 git url github.com/rtef23/JpaStudy
필요 1. docker
2. docker-compose
프로젝트 정보 mysql : 5.7 - docker image
java : 1.8

 

프로젝션

  • JPQL로 조회된 엔티티는 영속성 컨텍스트에 의해 관리된다.
  • Select 절에 조회할 대상을 지정하는 것

 

엔티티

  • [JPQL] SELECT m FROM Member m
    • [SQL] SELECT * FROM Member
  • [JPQL] SELECT m.team FROM Member m
  • [JPQL] SELECT m.team FROM Member m JOIN Team t
    • [SQL] SELECT t.* FROM Member m INNER JOIN Team t ON m.team_id = t.id

 

임베디드 타입

  • [SQL] SELECT  o.address FROM Order o
    • [JPQL] SELECT o.city, o.street, o.zipcode FROM Order o

 

스칼라 타입(숫자, 문자등 기본 데이터 타입)

  • TypedQuery가 아닌 Query로 조회해야 한다. 
  • [SQL] SELECT m.username, m.age FROM Member m
    • [JPQL] SELECT m.username, m.age FROM Member m

스칼라 타입 - 여러 값 조회

  • Query 타입으로 조회
List results = entityManager.createQuery("select m.username, m.age from Member m").getResultList();

Object[] resultObjects = (Object[]) results.get(0);

System.out.println("resultObjects[0] : " + resultObjects[0]);
System.out.println("resultObjects[1] : " + resultObjects[1]);

/* 출력
resultObjects[0] : name-1
resultObjects[1] : 10
*/

 

  • Object[] 타입으로 조회
List<Object[]> results = entityManager.createQuery("select m.username, m.age from Member m").getResultList();

Object[] resultObjects = results.get(0);

System.out.println("resultObjects[0] : " + resultObjects[0]);
System.out.println("resultObjects[1] : " + resultObjects[1]);

/* 출력
resultObjects[0] : name-1
resultObjects[1] : 10
*/

 

  • new 명령어로 조회
public class MemberDTO {
  private String username;
  private int age;

  public MemberDTO(String username, int age) {
    this.username = username;
    this.age = age;
  }
  
  ... 
}
List<MemberDTO> results = entityManager.createQuery("select new com.personal.jpastudy.domain10.MemberDTO(m.username, m.age) from Member m", MemberDTO.class).getResultList();

System.out.println("result[0] : " + results.get(0));
/*
result[0] : MemberDTO{username='name-1', age=10}
*/

 

페이징

  • JPA는 페이징을 2개의 API로 추상화
  • setFirstResult(int startPosition) ; 조회 시작 위치
  • setMaxResults(int maxResult) ; 조회할 데이터 수
List<Member> members =
          entityManager
              .createQuery("select m from Member m order by m.age desc", Member.class)
              .setFirstResult(0)
              .setMaxResults(10)
              .getResultList();

System.out.println(members.toString().replace("},", "},\n"));

/* 출력
[Member{id=10, username='name-9', age=9},
 Member{id=9, username='name-8', age=8},
 Member{id=8, username='name-7', age=7},
 Member{id=7, username='name-6', age=6},
 Member{id=6, username='name-5', age=5},
 Member{id=5, username='name-4', age=4},
 Member{id=4, username='name-3', age=3},
 Member{id=3, username='name-2', age=2},
 Member{id=2, username='name-1', age=1},
 Member{id=1, username='name-0', age=0}]
*/

 

'JPA' 카테고리의 다른 글

[JPA] 24. JPQL - 타입 표현, 기타식  (0) 2021.01.31
[JPA] 23. JPQL - 조인, 서브 쿼리  (0) 2021.01.31
[JPA] 21. JPQL - 기본 문법 1  (0) 2021.01.26
[JPA] 20. JPA 쿼리 방법 소개  (0) 2021.01.25
[JPA] 19. 값 타입 컬렉션  (0) 2021.01.23