본문 바로가기

Study/JPA

[JPA] 객체 지향 쿼리

객체 지향 쿼리

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