개발/JPA

[JPA] 객체지향 쿼리

Jindory 2022. 2. 22. 21:55
반응형

안녕하세요. 개발자 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

반응형