[JPA 기본 - JPQL] 기본문법 (집합과 정렬, 반환 타입 및 개수, 파라미터 바인딩)

강신현·2022년 7월 27일
0

✅ TypeQuery vs Query ✅ query.getResultList() vs query.getSingleResult()


기본문법

select m from Member as m where m.age > 18
  • 엔티티와 속성은 대소문자를 구분하므로 주의하자. (Member, age)
  • JPQL 키워드는 대소문자 구분하지 않는다. (SELECT, FROM, where)
  • 테이블 이름이 아닌, 엔티티의 이름을 사용한다. (Member)
  • 별칭(m)은 필수이다. (as는 생략가능)

집합과 정렬

select
	COUNT(m), //회원수
	SUM(m.age), //나이 합
	AVG(m.age), //평균 나이
    MAX(m.age), //최대 나이
    MIN(m.age) //최소 나이
from Member m
  • GROUP BY, HAVING
  • ORDER BY
    👉 sql과 동일하게 사용

TypeQuery vs Query

- TypeQuery

반환 타입이 명확할 때 사용

TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m", Member.class);

👉 반환 타입이 Member 하나뿐이므로 명확

- Query

반환 타입이 명확하지 않을 때 사용

Query query = em.createQuery("SELECT m.username, m.age from Member m");

👉 반환 타입이 m.username(string) 과 m.age(int) 두개이므로 명확하지 않음


결과 조회

- query.getResultList()

결과가 하나 이상일 때

  • 리스트 반환
  • 결과가 없으면 : 빈 리스트 변환
TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
List<Member> resultList = query.getResultList();

for (Member member1 : resultList){
    System.out.println("member1 = " + member1);
}

- query.getSingleResult()

결과가 정확히 하나일 때

  • 단일 객체 반환
  • 결과가 없으면: javax.persistence.NoResultException
  • 둘 이상이면: javax.persistence.NonUniqueResultException
TypedQuery<Member> query = em.createQuery("select m from Member m where m.id = 10", Member.class);
            
Member result = query.getSingleResult();
System.out.println("result = " + result);

파라미터 바인딩

TypedQuery<Member> query2 = em.createQuery("SELECT m FROM Member m where m.username=:username", Member.class);
query2.setParameter("username", "member1");

Member singleResult = query.getSingleResult();
System.out.println("singleResult = " + singleResult.getUsername());
profile
땅콩의 모험 (server)

0개의 댓글