728x90
프로젝션
- 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로 중복 제거
예)
Member member = new Member();
member.setUsername("mem1");
member.setAge(10);
em.persist(member);
//영속성 컨텍스트를 비움
em.flush();
em.clear();
//result는 영속성 컨텍스트에서 관리가 될까? -> 관리가 됨
List<Member> result = em.createQuery("select m from Member m", Member.class)
.getResultList();
//값 변경이 반영 됨
Member findMember = result.get(0);
findMember.setAge(20);
여러 값 조회
SELECT m.username, m.age FROM Member m
1. Query 타입으로 조회
List resultList= em.createQuery("select m.username, m.age from Member m")
.getResultList();
Object o = resultList.get(0);
Object[] result = (Object[]) o;
System.out.println("username = " + result[0]);
System.out.println("age = " + result[1]);
2. Object[] 타입으로 조회
List<Object[]> resultList= em.createQuery("select m.username, m.age from Member m")
.getResultList();
Object[] result = resultList.get(0);
System.out.println("username = " + result[0]);
System.out.println("age = " + result[1]);
3. new 명령어로 조회
• 단순 값을 DTO로 바로 조회
- SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m
• 패키지 명을 포함한 전체 클래스 명 입력
• 순서와 타입이 일치하는 생성자 필요
List<MemberDTO> result = em.createQuery("select new jpql.MemberDTO(m.username, m.age) from Member m", MemberDTO.class)
.getResultList();
MemberDTO memberDTO = result.get(0);
System.out.println("memberDTO.getUsername() = " + memberDTO.getUsername());
System.out.println("memberDTO.getAge() = " + memberDTO.getAge());
페이징 API
JPA는 페이징을 다음 두 API로 추상화
setFirstResult(int startPosition): 조회 시작 위치 (0부터 시작)
setMaxResults(int maxResult): 조회할 데이터 수
//페이징 쿼리
String jpql = "select m from Member m order by m.age desc";
List<Member> result = em.createQuery(jpql, Member.class)
.setFirstResult(1)
.setMaxResults(20)
.getResultList();
System.out.println("result.size() = " + result.size());
for(Member mem : result){
System.out.println("mem = " + mem);
}
MySQL 방언
SELECT
M.ID AS ID,
M.AGE AS AGE,
M.TEAM_ID AS TEAM_ID,
M.NAME AS NAME
FROM
MEMBER M
ORDER BY
M.NAME DESC LIMIT ?, ?
Oracle 방언
SELECT * FROM
( SELECT ROW_.*, ROWNUM ROWNUM_
FROM
( SELECT
M.ID AS ID,
M.AGE AS AGE,
M.TEAM_ID AS TEAM_ID,
M.NAME AS NAME
FROM MEMBER M
ORDER BY M.NAME
) ROW_
WHERE ROWNUM <= ?
)
WHERE ROWNUM_ > ?
728x90
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
JPA | JPQL 문법 뿌시기 - 타입 표현, 조건식, 기본 함수 (0) | 2023.05.04 |
---|---|
JPA | JPQL 문법 뿌시기 - 조인, 서브 쿼리 (0) | 2023.05.04 |
JPA | JPQL 문법 뿌시기 - 기본 문법, 쿼리 API (0) | 2023.05.03 |
JPA | 객체지향 쿼리 언어 간단 소개 (JPQL, Criteria, QueryDSL 등) (0) | 2023.05.02 |
JPA | 예제로 알아보는 값 매핑 (예제 - 6) (0) | 2023.05.02 |