객체 지향 쿼리
JPA는 다양한 쿼리 방법을 지원
- JPQL
- JPQ Criteria
- QueryDSL
- 네이티브 SQL
- JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용
JPQL(java persistence query language)
- 가장 단순한 조회 방법
em.find();
// 객체 그래프 탐색
a.getB().getC();
- JPA를 사용하면 엔티티 객체를 중심으로 개발
- 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
- SQL을 추상화해서 특정 데이터베이스 SQL에 의존 X
- JPQL을 한마디로 정의하자면 객체 지향 SQL
JPQL 문법
- select m from Member m where m.age > 18
- from절에 있는 것은 객체
- 엔티티와 속성은 대소문자 구분함
- JPQL 키워드는 대소문자 구분 안함(Select, from, WHERE)
- 엔티티 이름을 사용, 테이블 이름이 아님(Member)
- 별칭은 필수
결과 조회
- query.getResultList() : 결과가 하나 이상, 리스트 반환
- query.getSingleResult(): 결과가 정확히 하나, 단일 객체 반환
파라미터 바인딩
- 이름 기준 - 가급적 이름 기준으로 사용
SELECT m FROM Member m where m.username=:username
query.setParameter("username", usernameParam);
- 위치 기준
SELECT m FROM Member m where m.username=?1
query.setParameter(1,usernameParam);
프로젝션
- SELECT m FROM Member m -> 엔티티 프로젝션
- SELECT m.team FROM Member m -> 엔티티 프로젝션
- SELECT username, age FROM Member m -> 단순 값 프로젝션
new 명령어 : 단순 값을 DTO로 바로 조회
SELECT new jpatest.jpql.userDTO(m.username, m.age) FROM Member m
distinct 예약어 사용 가능
페이징 API
- JPA는 페이징을 다음 두 API로 추상화
- set FirstResult(int startPosition): 조회 시작 위치(0부터 시작)
- setMaxResults(int maxResult) : 조회할 데이터 수
Named 쿼리 - 어노테이션
@Entity
@NamedQuery(name = "Member.findByUsername", query="SELECT m FROM Member m WHERE m.username=:username")
public class Member{ ... }
List<Member> resultList = em.createNamedQuery("Member.findByUsername", Member.class).setParameter("username","회원1").getResultList();
'Study > JPA' 카테고리의 다른 글
[JPA] Spring Data JPA와 QueryDSL 이해 (0) | 2022.01.13 |
---|---|
[JPA] JPA 내부 구조 (0) | 2022.01.12 |
[JPA] 양방향 매핑 (0) | 2022.01.12 |
[JPA] 연관관계 매핑 (0) | 2022.01.11 |
[JPA] JPA 필드와 컬럼 매핑 (0) | 2022.01.10 |