Java

[JPA(Jakarta Persistence API)] 다양한 쿼리 방법과 예시

ride-dev 2024. 3. 14. 21:19

DB에 요청하기 위해 SQL문을 사용합니다.

JPA(Jakarta Persistence API)는

JPQL, JPA Criteria, QueryDSL, 네이티브SQL, JDBC API 등

다양한 쿼리 방법을 지원합니다

JPQL

JPA 사용에 있어 토대가 되기 때문에 중요합니다.

String jpql = "select m from Member m where m.age > 30";

List<Member> result = em.createQuery(jpql, Member.class).getResultList();

객체 지향 쿼리 언어로,

SQL 문법과 유사하며, SQL을 추상화하여 DB에 독립적입니다.

SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원합니다.

가장 단순한 조회 방법입니다.

엔티티 매니저를 사용합니다.

테이블이 아닌 엔티티 객체를 대상으로 검색합니다.

(SQL은 DB 테이블을 대상으로 쿼리합니다)

모든 DB 데이터를 객체로 변환해서 검색하는 것이 불가능합니다.

(필요한 데이터만 불러오려면 조건을 포함한 SQL이 필요합니다)

Criteria

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> query = cb.createQuery(Member.class);

Root<Member> m = query.from(Member.class);

CriteriaQuery<Member> cq = 
    query
        .select(m)
        .where(cb.equal(m.get("name"), "ride"));
List<Member> resultList = em.createQuery(cq).getResultList();

문자가 아닌 자바 코드로 JPQL을 작성할 수 있습니다.

JPQL 빌더 역할을 합니다.

동적쿼리를 작성하기 용이하고, 컴파일 오류를 확인할 수 있지만,

복잡하기 때문에 유지보수가 어렵다는 단점이 있습니다.

대신 QueryDSL 사용이 권장됩니다.

QueryDSL

JPAFactoryQuery query = new JPAQueryFactory(em);
QMember m = QMember.member;

List<Member> list = 
    query
        .selectFrom(m)
        .where(m.age.gt(30)
        .orderBy(m.name.desc())
        .fetch();

문자가 아닌 자바코드로 JPQL을 작성할 수 있습니다.

JPQL 빌더 역할을 합니다.

동적쿼리를 작성하기 용이하고, 컴파일 오류를 확인할 수 있으며 SQL과 유사합니다.

단순하고 쉽습니다.

네이티브 SQL

JPA가 제공하는 SQL을 직접 사용하는 기능입니다.

JPQL로 해결할 수 없는 특정 DB에 의존적인 기능을 사용할 때 사용합니다.

em.createNativeQuery("select MEMBER_ID, city, postalcode, name from MEMBER")
    .getResultList();

JDBC 직접 사용, Spring JdbcTemplate 등

JPA를 사용하면서 JDBC커넥션을 직접 사용하거나, 스프링 JdbcTemplate, 마이바티스 등을 함께 사용 가능합니다.

단 영속성 컨텍스트를 적절한 시점에 강제로 플러시하는 것이 필요합니다.

(JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트를 수동으로 플러시하는 것이 필요합니다)

728x90