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 |