JPQL, jpql프로젝트

전영덕·2023년 5월 1일
0

Springboot

목록 보기
12/13

day11 오후 부분

1. JPQL

  • JPA의 CRUD에서 JPQL, JPA Criteria, QueryDSL, 네이티브 SQL, JDBC API(MyBAtis) 등이 있으나 JPQL, QueryDSL 2가지를 주로 사용하며 둘중 편한거 아무거나 쓰면 된다.
    JPA criteria는 가독성이 너무떨어지고 어렵다. 배우지도 않고 쓰지도 않는다. JPA가 붙어있으니 JPA에서 만든거긴한데 실무 안 한 사람이 만들었나?겁나 못만들었나봄. JPQL로 실무에서 발생하는 문제의 100%를 해결하지 못하지만 한 3년차까지의 업무난이도중에는 JQPL로 해결안될것은 없을것 같다.
    이 2가지로도 안되면 native sql로하면된다.

1-1. JPQL소개(Java Persistence Query Language : 자바진영의 쿼리 언어)

  • 가장 단순한 조회 방법
  • JPA를 사용하면 엔티티 객체를 중식으로 개발 -> 문제는 검색 쿼리.
  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
  • SQL과 문법이 유사하며, select from , where, group by, having, join지원
  • JPQL : 엔티티 객체를 대상으로 쿼리
  • SQL : 데이터 베이스 테이블을 대상으로 쿼리
  • SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않음.
    JPA는 JPQL을 분석한 후 적절한 SQL을 만들어서 데이터 베이스를 조회

3-2. 사용법

  • 쿼리열심히공부했으면 참 쉬울 것이다. 규칙만 지키면 쿼리문만든기는 쉽다.

  • 엔티티와 속성은 대소문자 구분하며, JPQL키워드는 구분하지 않는다.

  • 엔티티 이름
    ->> 테이블명 대신 엔티티명을 사용, @Entity(name="" )지정하지 않을 시 클래스 명을 기본값으로 사용한다.

  • 별칭을 필수
    -> JPQL에서는 별칭은 필수
    -> AS는 생략가능

--------------jpql을 위한 프로젝트를 하나 만들어 보려고 한다.
jpql프로젝트
lombok, oracle driver, spring data jps 3가지를 디펜던시로해서 임포트해준다

1-3. JPQL문법

  • select문 : select 절
    from 절
    where 절
    group by 절
    having 절
    order by 절

  • update문 : update 절
    where 절

  • delete문 : delete 절
    where 절

  • select m from Member as m where m.age > 18
    => 엔티티 속성 : Member, age는 대소문자를 구분해 준다.
    자바클래스는 대소문자를 구분한다.
    => JPQL키워드는 대소문자를 구분하지 않는다. ex) select, from, where등등

1-4. 집합과 정렬

select count(m), //회원수
sum(m.age), //나이의 합
avg(m.age), //평균 나이
max(m.age), //최대 나이
min(m.age) //최소 나이
from Member m

1-5. 반환타입 지정

  • TypeQuery : 반환 타입이 명확할 때 사용
  • Query : 반환 타입이 명확하지 않을 때 사용
    TypeQuery query = em.createQuery("select m from Member m", Member.class);

Query query = em.createQuery("select m.username, m.age from Member m");

1-6. 결과 조회

결과를 보는 2가지 방법
-query.getResultList() : 결과가 하나 이상일 때, ArrayList로 결과값이 나온다.
-> 결과가 없으면 빈 리스트를 반환한다.
-> 빈 collection이 반환되기 때문에 NullPointerException에 대한 걱정은 하지 않아도 된다.

  • query.getSingleResult() : 결과가 정확히 하나(조심!!)일 때, 단일 객체를 반환한다.
    -> 결과가 없으면 : javax.persistence.NoResultException이 발생한다.
    -> 결과가 둘 이상이면 : javax.persistence.NonUniqueResultException이 발생한다.

5월2일 화요일

2. 파라미터 바인딩 - 이름 기준, 위치 기준

2-1. 이름 기준

select m from Member m where m.username= :username
query.setParameter("username",username);

2-2. 위치 기준 - 파라미터의 위치마다 바뀌므로 쓰지 말 것

select m from Member m where m.username= ?1
query.setParameter(1,usernameParam)

JpaMain2.java 만들고 테스트해봄

3. 프로젝션

  • select절에서 조회할 대상을 지정하는 것
  • 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 타입)
  • select m from Member m
    => 엔티티 프로젝션 (Member 엔티티조회)
  • select m.team From Member m
    => 엔티티 프로젝션 (Member와 관련된 team을 가지고 온다.)
  • select m.address From Member m
    => 임베디드 타입 프로젝션
  • select m.username, m.age from Member m
    => 스칼라 타입 프로젝션

JpaMain3.java 만들고 테스트해봄

4. 페이징 API

  • JPA는 페이징을 다음 두 API로 추상화
  • setFirstResult(int startPosition) : 조회 시작 위치(0부터 시작)
  • setMaxResults(int maxResult) : 조회할 데이터 수
    -> 몇 번째부터 몇 개 가지고 올래?
    JpaMain4.java 만들고 테스트해봄

5. 조인

  • 문법이 객체 스타일로 나간다
  • 내부 조인 :
    select m from Member inner join m.team t
    select m from Member join m.team t //이렇게 생략도 가능
  • 외부 조인 :
    select m from Member m left [outer] join m.team t
  • 세타 조인 : 연관관계가 없는 막 조인인데 쓸일이 있을지 모르겠다. 보통 FK로 묶인 것에서 조인을 많이하지만
    꼭 FK가 있어야만 조인이있는 것은 아니다. 이렇게 막 조인하는 것도 가능은 한데 비즈니스로직상 거의 그럴일은 적다.
    select count(m) from Member m, Team t where m.username = t.name

JpaMain5.java 만들고 테스트해봄

6. 서브 쿼리

  • 이건 뭐 필기할 것도 없다
    JpaMain6.java 만들고 테스트해봄

jqpl은 여기까지 한다. JPA는 jpql로 99퍼센트 처리가능하다. queryDSL도 한번 보긴 볼 것이다.

0개의 댓글