본문 바로가기
웹개발/JPA

JPA가 지원하는 다양한 쿼리 방법

by 철없는민물장어 2023. 7. 22.
728x90

JPA는 다양한 쿼리 방법을 지원한다.

  • JPQL
  • JPA Criteria
  • QueryDSL
  • 네이티브 SQL
  • JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용

 

JPQL

JPA를 사용하면 엔티티 객체를 중심으로 개발하는데, 검색을 할때도 테이블이 아닌 엔티티 객체를 대상으로 검색할 수 있어야한다. 모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능하므로 결국 검색 조건이 포함된 SQL이 필요하다.

JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. SQL과 문법이 유사하지만 JPQL은 엔티티 객체를 대상으로 쿼리하고, SQL은 데이터베이스 테이블을 대상으로 쿼리한다는 점이 다르다

 

JPQL은 객체 지향 SQL이라고 말할 수 있다.

List<Member> resultList = em.createQuery("select m From Member m where m.name like '%kim%'", Member.class).getResultList();

(여기서 Member는 테이블이 아니라 Member엔티티를 가르킨다. em.createQuery)

 

예시로, 위 코드를 실행시키면

이런 쿼리가 나가는것을 볼 수 있다.

 

이 방법은 단순히 String으로 쿼리를 작성하기때문에 동적 쿼리를 작성하기에 불편함이 있을 수 있다.


Criteria
            CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
            CriteriaQuery<Member> query = criteriaBuilder.createQuery(Member.class);
            Root<Member> m = query.from(Member.class);
            CriteriaQuery<Member> cq = query.select(m).where(criteriaBuilder.equal(m.get("name"), "kim"));
            List<Member> resultList = em.createQuery(cq).getResultList();

Criteria는 자바코드로 쿼리를 작성할 수 있다. 

단순 String이 아니기 때문에 오류를 잡기 좋고, 동적쿼리를 작성하기 편리하다는 장점이 있다.

하지만 SQL과 너무 다른 형태여서 사용하기 불편할 수 있다. 


QueryDSL

동적쿼리 작성이 편리하고, 단순하고 쉬움. 실무 사용이 권장된다.

(이것은 추후에 다루도록 하겠음)

http://querydsl.com/

 

Querydsl - Unified Queries for Java

Unified Queries for Java. Querydsl is compact, safe and easy to learn. <!-- Querydsl Unified Queries for Java Querydsl provides a unified querying layer for multiple backends in Java. Compared to the alternatives Querydsl is more compact, safer and easier

querydsl.com

JPQL 빌더 역할을 하며 컴파일 시점에 문법 오류를 찾을 수 있다.


Native SQL
em.createNativeQuery("select  MEMBER_ID, city, street, zipcode, USERNAME from MEMBER").getResultList();

JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능 등을 사용할때는 네이티브 SQL를 사용해야할 수 있다.

 

728x90

'웹개발 > JPA' 카테고리의 다른 글

JPQL  (0) 2023.07.22
값 타입  (0) 2023.07.19
영속성 전이 CASCADE  (0) 2023.07.19
즉시 로딩과 지연 로딩  (0) 2023.07.16
프록시  (0) 2023.07.14

댓글