Study/JPA
[JPA] 객체 지향 쿼리
v무지렁이v
2022. 1. 13. 02:36
객체 지향 쿼리
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();