10. 객체지향 쿼리 언어 - 기본 문법 (기본 문법과 쿼리 API)

HotFried·2023년 10월 3일
0

JPQL 소개

JavaJava PersistencePersistence QueryQuery LanguageLanguage

  • 객체 지향 쿼리 언어
    -> 테이블이 아니라 Entity 객체를 대상으로 쿼리

  • SQL을 추상화해서 특정 DB SQL에 의존 X

  • JPQL은 결국 SQL로 변환된다.


이후 사용될 예제의 모델


JPQL 문법

  • 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도 똑같이 이용하면 된다.


TypeQuery, Query

  • TypeQuery : 반환 타입이 명확할 때 사용
  • Query : 반환 타입이 명확하지 않을 때 사용
//Member.class를 명시해줬기에 Member제네릭을 가진다.
TypedQuery<Member> query =
    em.createQuery("SELECT m FROM Member m", Member.class); 
    
//반환 타입이 명확하지 않을 경우 Query 사용  
Query query = 
    em.createQuery("SELECT m.username, m.age from Member m"); 

결과 조회 API

query.getResultList(): 결과가 하나 이상일 때, 리스트 반환

  • 결과가 없으면 빈 리스트 반환

query.getSingleResult(): 결과가 정확히 하나, 단일 객체 반환

  • 결과가 없으면: javax.persistence.NoResultException
  • 둘 이상이면: javax.persistence.NonUniqueResultException

파라미터 바인딩

이름 기준

Member singleResult = em
        .createQuery("SELECT m FROM Member m where m.username=:username", Member.class)
        .setParameter("username", "member1");

System.out.println(singleResult.getUserName());

:username, "username"
이름으로 지정해서 가져오기 때문에 순서가 뒤바뀌는 실수가 발생하지 않는다.


위치 기준

TypedQuery<Member> query = em
        .createQuery("SELECT m FROM Member m where m.username=?1", Member.class);
query.setParameter(1, usernameParam);

?1, 1
파라미터를 위치기준으로 끼워넣으면 실수할 수 있다. -> 웬만하면 사용하지 말 것


참고 :

김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.

자바 ORM 표준 JPA 프로그래밍 - 기본편

profile
꾸준하게

0개의 댓글