반응형
안녕하세요. 개발자 Jindory입니다.
오늘은 JPA 객체지향 쿼리에 대해서 알아보는 글을 작성해보고자 합니다.
JPA는 다양한 쿼리 방법을 지원
- JPAL
- JPA Criteria
- QuertDSL
- 네이티브 SQL
- JDBC API 직접 사용, Mybatis, Srping JDBC Template 함께 사용
JPQL이란
- JPA에서 SQL을 추상화한 JPQL(Java Persistence Query Language)이라는 객체 지향 쿼리 언어이다.
- 엔티티 객체를 대상으로 데이터를 조회한다.
- SQL과 문법이 유사하며, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 등의 언어를 지원한다.
- SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.
// 검색
String jpql = "select m From Member m where m.name like '%hello%'";
List<Member> result = em.createQuery(jpql, Member.class).getResultList();
JPQL 문법
- from절에 들어가는 것은 객체이다.
- 엔티티와 속성은 대소문자를 구분한다(Member, username)
- JPQL 키워드는 대소문자를 구분하지 않는다(Select, FROM, where)
- 별칭은 필수값이다.
결과 조회 API
- 단일 객체 결과 반환 : 단일 객체만 반환값을 예상한다면 아래의 명령어를 사용하여 결과값을 가져온다.(결과값이 단일객체가 아닐경우 예외 발생)
query.getSingleReuslt(); - 하나 이상의 결과 반환 : 하나 이상의 결과 반환을 원할 경우 아래의 명령어를 사용하여 결과값을 가져온다.
query.getResultList();
파라미터 바인딩
- 이름 기준 바인딩
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);
프로젝션(Projection)
엔티티 속성들 중 전부 혹은 일부를 가져오는 방법이다.
// 엔티티를 가져오는 방식
SELECT m FROM Member m
// 엔티티에 포함된 객체를 가져오는 방식
SELECT m.team FROM Member m
// 단순 값을 가져오는 방식
SELECT username, age FROM Member m
// DTO로 조회하는 방식
SELECT new jpabook.jpql.UserDTO(m.username,m.age) FROM Member m
페이징 API
JPA는 페이징을 아래의 두 API로 추상화 하였다.
- setFirstResult(int startPosition)
조회의 시작위치를 설정(설정하지 않을경우 0으로 설정) - setMaxResults(int maxResult)
조회할 데이터 최대 갯수를 지정
// 페이징 쿼리
String jpql = "select m from Member m order by m.name desc";
List<Member> resultList = em.createQuery(jpql,Member.class)
.setFirstResult(10)
.setMaxResults(20)
.getResultList();
집합과 정렬
- COUNT(갯수)
- SUM(합계)
- AVG(평균)
- MAX(최댓값)
- MIN(최솟값)
조인
- 내부조인 : SELECT m FROM Member m [INNER] JOIN m.team t
- 외부조인 : SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
- 세타조인 : SELECT count(m) FROM Member m, Team t where m.username = t.name
- 페치조인
- 엔티티 객체 그래프를 한번에 조회하는 방법이다.
- 별칭을 사용할 수 없다.
- SELECT m FROM Member m join FETCH m.team
JPQL 기본 함수
- CONCAT(문자들을 연결)
- SUBSTRING(문자열중 일부 문자만 취함)
- TRIM(공백제거)
- LOWER(소문자로 변경), UPPER(대문자로 변경)
- LENGTH(길이 반환)
- LOCATE(문자열 위치 반환)
- ABS(절대값), SQRT(제곱근), MOD(나머지 연산)
- SIZE, INDEX
- COALESCE(처음으로 널이 아닌 값을 만나면 그 값을 반환)
- NULLIF(두 값이 같으면 null, 다르면 첫번째 값 반환)
- 사용자 정의 함수 지원
Named 쿼리 - 정적 쿼리
- 미리 정의해서 이름을 부여해두고 사용하는 JPQL이다.
- 어노테이션, XML로 정의가 가능하다.
- 어플리케이션 로딩 시점에 초기화 후 재사용이 가능하다.
- 어플리케이션 로딩 시점에 쿼리를 검증하여 문제 발생시 에러를 반환한다.
@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();
이렇게 JPA 객체지향 쿼리에 대해서 알아봤습니다.
혹시라도 정정할 내용이나 추가적으로 필요하신 정보가 있다면 댓글 남겨주시면 감사하겠습니다.
오늘도 Jindory 블로그에 방문해주셔서 감사합니다.
[참조]
https://www.youtube.com/watch?v=WfrSN9Z7MiA&list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U
반응형
'개발 > JPA' 카테고리의 다른 글
[JPA] JPA 설정 방법 (0) | 2022.05.01 |
---|---|
[JPA] JPA 관련 application.properties 설정 (0) | 2022.04.27 |
[JPA] JPA 영속성 컨텍스트 (0) | 2022.02.22 |
[JPA] JPA 연관관계 매핑 (0) | 2022.02.17 |
[JPA] JPA 기초 (0) | 2022.02.16 |