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

백승한·2022년 10월 1일
0

스프링

목록 보기
13/14

Creteria

//Criteria 사용 준비
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();

장점 : 동적쿼리 가능, 문자가 아닌 자바코드롤 작성하기때문에 컴파일 단계에서 오류 잡을수 있음.
단점 : 못알아봐서 유지보수가 안된다.
결론 : Criteria 대신에 QueryDSL(오픈소스 라이브러리) 사용 권장

// flush()가 호출되는 시점 두가지 : commit, query

TypeQuery, Query

  • TypeQuery: 반환 타입이 명확할 때 사용
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
    • 결과가 없다면 null 값이 아니라 Exception

프로젝션

  • SELECT 절에 조회할 대상을 지정하는 것
  • 프로젝션 대상: 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자등 기본 데이터 타
    입)
  • SELECT m FROM Member m -> 엔티티 프로젝션
  • SELECT m.team FROM Member m -> 엔티티 프로젝션
  • SELECT m.address FROM Member m -> 임베디드 타입 프로젝션
  • SELECT m.username, m.age FROM Member m -> 스칼라 타입 프로젝션

프로젝션 - 여러 값 조회

  • SELECT m.username, m.age FROM Member m
    1. Query 타입으로 조회
    1. Object[] 타입으로 조회
    1. new 명령어로 조회 ( 이걸로 사용 )
    • 단순 값을 DTO로 바로 조회
      SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m
    • 패키지 명을 포함한 전체 클래스 명 입력
    • 순서와 타입이 일치하는 생성자 필요

조인

  • 내부 조인 : 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개의 댓글