Spring

14. 기본 문법과 쿼리 API

공대키메라 2021. 7. 24. 16:14

JPQL(Java Persistence Query Language)

 

  • JPQL은 객체지향 쿼리 언이이다. 따라서 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다. 
  • JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.
  • JQPL은 결국 SQL로 변환된다. 

 

 

 

 

 

 

근데 위치 기반 쓰면 안됀다!

 

이름을 적는것은 위치가 바뀌어도 버그가 안생김!

 

무조건 이름 기반으로 작성한다

 

 

프로젝션

  • 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 => 스칼라 타입 프로젝션
  • DISTINCT 로 중복 제거

 

 

 

이것뿐만 아니라 Paging API도 제공을 한다.

 

Oracle을 이용해서 Paging 처리를 해본 사람은 알텐데

 

정 말 열 받 는 다!

할 때 마다 rownum 으로 감싸야하고 진짜 귀찮아 나죽어 ㅠㅠ

 

하지만 여기서는 그런걱정 할 필요가 없다 ㅎㅎ

.

package jqpl;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;

public class JapMain {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpql");
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {

            for (int i = 0; i < 100; i++) {
                Member member = new Member();
                member.setUsername("member" + i);
                member.setAge(i);
                em.persist(member);
            }

            em.flush();
            em.clear();

            List<Member> pagingList = em.createQuery("select m from Member m order by m.age desc", Member.class)
                    .setFirstResult(0)
                    .setMaxResults(10).getResultList();

            System.out.println("pagingList.size() = " + pagingList.size());
            for (Member member1 : pagingList) {
                System.out.println("member1 = " + member1);
            }
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            em.clear();
        }
        emf.close();
    }

}
/*
 CONSOLE창 결과값...
... 
Hibernate: 
    select
        m 
    from
        Member m 
    order by
        m.age desc  select
            member0_.id as id1_0_,
            member0_.age as age2_0_,
            member0_.TEAM_ID as TEAM_ID4_0_,
            member0_.username as username3_0_ 
        from
            Member member0_ 
        order by
            member0_.age desc limit ?
      pagingList.size() = 10
      member1 = Member{id=100, username='member99', age=99}
      member1 = Member{id=99, username='member98', age=98}
      member1 = Member{id=98, username='member97', age=97}
      member1 = Member{id=97, username='member96', age=96}
      member1 = Member{id=96, username='member95', age=95}
      member1 = Member{id=95, username='member94', age=94}
      member1 = Member{id=94, username='member93', age=93}
      member1 = Member{id=93, username='member92', age=92}
      member1 = Member{id=92, username='member91', age=91}
      member1 = Member{id=91, username='member90', age=90}
      7월 24, 2021 4:08:12 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
      INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/test]

      Process finished with exit code 0
*/

 

 

'Spring' 카테고리의 다른 글

16. 경로 표현식 / 페치조인  (0) 2021.07.25
15. 조인  (0) 2021.07.24
13. 객체지향 쿼리 언어(JPQL)  (0) 2021.07.24
12. 값 타입의 비교 ~  (0) 2021.07.22
11. 값 타입과 불변 객체~  (0) 2021.07.21