기본 문법과 쿼리 API

jpa-jpql 프로젝트 실습

  • JPQL은 객체지향 쿼리 언어다.따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다.

  • JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하 지 않는다.

  • JPQL은 결국 SQL로 변환된다.update문, delete문 : 벌크 연산. 한번에 여러개를 연산할 때.

객체 모델과 DB 모델

JPQL 문법

select_문 :: = 
    select_절
    from_절
    [where_절]
    [groupby_절]
    [having_절]
    [orderby_절]

update_문 :: = update_절[where_절]
delete_문 :: = delete_절 [where_절]
• select m from Member as m where m.age > 18
  • 엔티티와 속성은 대소문자 구분O (Member, age)

  • JPQL 키워드는 대소문자 구분X (SELECT, FROM, where)

  • 엔티티 이름 사용, 테이블 이름이 아님(Member) 별칭은 필수(m) (as는 생략가능)

집합과 정렬

  • GROUP BY

  • HAVING ORDER BY

select

    COUNT(m), //회원수
    
SUM(m.age), //나이 합

    AVG(m.age), //평균 나이
    MAX(m.age), //최대 나이
    MIN(m.age) //최소 나이

from Member m

TypeQuery와 Query⭐️⭐️⭐️⭐️⭐️

  • TypeQuery: 반환 타입이 명확할 때 사용

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

결과 조회 API

  • query.getResultList(): 결과가 하나 이상일 때, 리스트 반환 결과 없으면 빈 리스트 반환(NullPointerException은 걱정 안해도 됨.)

  • query.getSingleResult() select m from Member as m where m.id==... 이렇게 식별자 값을 정해서 결과가 정확히 하나의 단일 객체를 반환할 때 결과가 없으면 : javax.persistence.NoResultException 둘 이상이면 : javax.persistence.NonUniqueResultException Spring Data JPA => 결과가 없으면 Exception이 아니라 null 또는 optional 반환.

파라미터 바인딩 - 이름 기준

TypedQuery<Member> query = em.createQuery("select m from Member as m where m.username = :username", Member.class);//TypeQuery라는 제네릭을 반환한다! 왜냐하면 타입정보를 명확하게 줬기 때문!
query.setParameter("username","member1");
Member singleResult = query.getSingleResult();
System.out.println("singleResult = " + singleResult);

보통 아래처럼 체인메서드로 사용한다.

Member result = em.createQuery("select m from Member as m where m.username = :username", Member.class)
  .setParameter("username", "member1")
  .getSingleResult();
            System.out.println("result = " + result);

파라미터 바인딩 - 위치 기준 잘 사용하지 않는다. 인덱스가 중간에 삽입되면 장애 발생하기 때문!

SELECT m FROM Member m where m.username=?1
query.setParameter(1, usernameParam);

Last updated

Was this helpful?