JPA

[JPA] 20. JPA 쿼리 방법 소개

inuma 2021. 1. 25. 23:04
프로젝트 git url github.com/rtef23/JpaStudy
필요 1. docker
2. docker-compose
프로젝트 정보 mysql : 5.7 - docker image
java : 1.8

 

JPA에서 지원하는 쿼리 방법

  • JPQL(Java Persistence Query Language)
  • JPA Criteria
  • QueryDSL
  • native SQL
  • JDBC API 직접 사용, MyBatis, SpringJdbcTemplate과 함께 사용

 

JPQL

  • JPA에서 SQL을 추상화한 객체 지향 쿼리 언어
  • SQL 문법과 유사(Select, From, Where, Group by, Having, Join 지원)
  • JPQL은 엔티티 객체를 대상으로 쿼리
  • SQL은 데이터 베이스 테이블을 대상으로 쿼리
  • 문자열 기반의 객체 지향 쿼리 작성 방법
List<Member> members =
          entityManager
              .createQuery("select m from Member m where m.name like '%test%'", Member.class)
              .getResultList();
  • 일반적인 SQL과는 다르게 select * ~가 아닌 Member 엔티티를 대상으로 조회 쿼리를 작성하게 된다.

 

JPA Criteria

  • JPQ에서 동적 쿼리 지원을 수월하도록 지원하도록 하는 방법
  • 문자열이 아닌 자바 코드로 JPQL을 작성할 수 있음
  • 컴파일 시점에서 쿼리 오류를 어느 정도 해소 가능
  • 한눈에 SQL을 파악하기 어려움
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Member> query = criteriaBuilder.createQuery(Member.class);

//루트 클래스 (조회를 시작할 클래스)
Root<Member> memberRoot = query.from(Member.class);

//쿼리 생성
CriteriaQuery<Member> selectQuery =
query.select(memberRoot).where(criteriaBuilder.like(memberRoot.get("name"), "test"));

//쿼리 실행
List<Member> findMembers = entityManager.createQuery(selectQuery).getResultList();

 

QueryDSL

  • 오픈 소스 라이브러리
  • JPQL 빌더 역할
  • 동적 쿼리 작성 편리
  • 사용하기 위해서는 QueryDSL 설정 필요
//[JPQL] select m from Member m where m.age > 18 order by name DESC 
JPAFactoryQuery query = new JPAQueryFactory(entityManager);
QMember member = QMember.member;

List<Member> findMembers = query
  .selectFrom(member)
  .where(m.age.gt(18))
  .orderBy(m.name.desc)
  .fetch();

 

native SQL

  • JPA가 SQL을 직접 사용할 수 있도록 제공하는 기능
  • JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능
    • example) oracle DB - Connect By, 특정 DB에서 사용하는 힌트
String sql = "select member_id, name from Member where name like '%test%'";

List<Member> findMembers1 = entityManager.createNativeQuery(sql, Member.class).getResultList();

 

JDBC 직접 사용, SpringJdbcTemplate, ...

  • JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, SpringJdbcTemplate, MyBatis 등을 함께 사용 가능
  • 단, 영속성 컨텍스트를 적절한 시점에 flush 호출이 필요함
    • JPQL을 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트 flush API 호출이 필요하다.

 

'JPA' 카테고리의 다른 글

[JPA] 22. JPQL - 기본 문법 2  (0) 2021.01.27
[JPA] 21. JPQL - 기본 문법 1  (0) 2021.01.26
[JPA] 19. 값 타입 컬렉션  (0) 2021.01.23
[JPA] 18. 값 타입 - 불변 객체  (0) 2021.01.21
[JPA] 17. 값 타입  (0) 2021.01.21