기본문법

Mina Park·2022년 10월 22일
0

📌 JPQL 소개

  • 객체지향 쿼리이므로 테이블이 아닌, 엔티티 객체를 대상으로 쿼리
  • SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않음
  • 결국은 SQL로 변환됨

1. 기본문법

  • 엔티티, 속성: 대소문자 구분 O
  • JPQL 키워드: 대소문자 구분 X (select, from, where...)
  • 엔티티 이름 사용(테이블 이름이 아님)
  • 별칭 필수!!! as는 생략 가능

2. 집합과 정렬

  • group by, having
  • order by

3. TypeQuery, Query

  • TypeQuery: 반환타입이 명확할 때
  • Query: 반환타입이 명확하지 않을 때
 //Query, TypedQuery
            TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
            List<Member> resList = query.getResultList(); //컬렉션 반환
            Member resOne = query.getSingleResult(); // 하나만 반환

            TypedQuery<String> query2 = em.createQuery("select m.username from Member m", String.class);
            Query query3 = em.createQuery("select m.username, m.age from Member m");//타입정보를 가져올 수 없을 때

4. 결과조회 API

  • query.getResultList(): 결과가 하나 이상일 때, 리스트 반환
    • 결과가 없으면 빈 리스트 반환
  • query.getSingleResult(): 결과가 정확히 하나, 단일 객체 반환
    • 결과가 없으면: javax.persistence.NoResultException
    • 둘 이상이면: javax.persistence.NonUniqueResultException

📌 getSingleResult()의 경우 예외처리가 중요한데, spring data jpa을 사용하게 되면 그 안에서 try catch나 Optional 클래스를 사용하여 예외처리를 하고 반환해주므로 그다지 신경쓰지 않아도 됨

5. 파라미터 바인딩

  • 이름기준, 위치기준 2가지 방법이 있지만 실무에서는 이름기준으로만 사용할 것!!!
 //Param Binding(이름 기준)
            Member singleResult = em.createQuery("select m from Member m where m.username = :username", Member.class)
                    .setParameter("username", "member1")
                    .getSingleResult();

0개의 댓글