[스프링 JPA] WEEK 5

enxnong·2023년 10월 13일
0

김영환님의 강의 자바 ORM 표준 JPA 프로그래밍 - 기본편 보면서 공부한 내용입니다.

🏊‍♀️ 섹션 10

객체지향 쿼리 언어1 - 소개

📝 JPQL

  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
  • 검색시 테이블이 아닌 엔티티 객체를 대상으로 검색
  • SQL문법과 유사함(테이버베이스 테이블을 대상으로 쿼리)
  • JPQL은 결국 SQL로 변환됨
    ✅ SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원

📝 Criteria

  • 문자가 아닌 자바코드로 JPQL을 작성할 수 있다
  • JPQL 빌더 역할, JPA 공식 기능
  • 단점 : 너무 복잡하고 실용성이 없다.
    ✅ Criteria 대신에 QueryDSL 사용 권장
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> query = cb.createQuery(Member.class);
            
Root<Member> m = query.from(Member.class);
CriteriaQuery<Member> cq = query.select(m)
								.where(cb.equal(m.get("username"), "kim"));
List<Member> resultList = em.createQuery(cq).getResultList();

📝 QueryDSL

  • 문자가 아닌 자바코드로 JPQL을 작성할 수 있다
  • 컴파일 시점에 문법 오류를 찾을 수 있다
  • JPQL 빌더 역할
  • 동적쿼리 작성이 편하다
  • 실무 사용 권장

기본 문법과 쿼리 API

📝 JPQL 문법

  • 엔티티와 속성은 대소문자 구분 O
  • JPQL 키워드는 대소문자 구분 X
  • 엔티티 이름 사용 O, 테이블 이름 사용 X
    ✅ Member대신 MM 이름 사용
  • 별칭은 필수!!!
    ✅ ex) select m from Member m
  • TypeQuery, Query
    ✅ TypeQuery : 반환타입이 명확할 때 사용
    ✅ Query : 반환타입이 명확하지 않을 때 사용
// 타입 정보 명확할 때
TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
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");

📝 결과 조회 API

  • query.getResultList() : 결과가 하나 이상일 때, 리스트 반환
    ✅ 결과가 없으면 빈 리스트 반환
  • query.getSingleResult() : 결과가 정확히 하나일 때, 단일 객체 반환
    ✅ 결과가 없으면 NoResultException
    ✅ 둘 이상이면 NonUniqueResultException
Member singleResult = em.createQuery("select m from Member m where m.username= :username", Member.class)
                    .setParameter("username", "member1")
                    .getSingleResult();

프로젝션

📝 프로젝션

  • SELECT 절에 조회할 대상을 지정하는 것
  • 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입
    ✅ 스칼라 타입 : 숫자, 문자등 기본 데이터 타입

페이징

📝 페이징 API

  • setFirstResult(int startPosition) : 조회 시작 위치 (0부터 시작)
  • setMaxResults(int maxResult) : 조회할 데이터 수
List<Member> result = em.createQuery("select m from Member m order by m.age desc", Member.class)
                    .setFirstResult(0)  // 0번째부터
                    .setMaxResults(10)  // 10개 가지고 올꺼야
                    .getResultList();

조인

📝 조인

  • 내부 조인
    ✅ select m from Member m [INNER]JOIN m.team t
  • 외부 조인
    ✅ select m from Member m LEFT[OUTER]JOIN m.team t
  • 세타 조인
    ✅ select count(m) from Member m, Team t where m.username = t.name
profile
높은 곳을 향해서

0개의 댓글