[자바 ORM 표쥰 JPA 프로그래밍] 24일차 - QueryDSL

[자바 ORM 표쥰 JPA 프로그래밍] 24일차 - QueryDSL

1. QueryDSL 이란

쿼리를 생성하는 방법 중 직접 자바 소스상 SQL를 작성하여 구현하는 JPQL 방식도 있지만

컴파일 단계에서 오류를 검증하지 못한다는 단점이 있다.

이를 보완하기 위해 JPA는 Criteria Query 라이브러리와 QueryDSL 라이브러리를 사용하여

컴파일 단계에서 쿼리의 오류를 검증할 수 있고 IDE의 자동완성의 기능으로 구현할 수 있다.

그런데 Criteria 라이브러리는 가독성과 작성이 너무 어렵고 복잡하여.. 책에선 나와있지만 생략했다..

대신 QueryDSL를 비교적 많이 사용한다길래 작성한다.

QueryDSL은 오픈소스 프로젝트이며 데이터를 조회하는데 있어 기능이 특화되어있다.

2. 환경설정

pom.xml

... com.mysema.querydsl querydsl-jpa 3.6.3 com.mysema.querydsl querydsl-apt 3.6.3 provided com.mysema.maven apt-maven-plugin 1.1.3 process target/generated-sources/java com.mysema.query.apt.jpa.JPAAnnotationProcessor

Criteria 와 QueryDSL은 메타모델이라는 개념을 사용하는데

엔티티를 코드상 쿼리로 사용할 수있도록 엔티티 모델들을 한꺼번에 Q frefix로 하는 java코드로 생성해준다.

pom.xml에 위와같이 추가해주고 mvn compile를 하게 된다면 target/generated-sources/java 위치에 모든 엔티티의 메타모델이 생성된다.

target에 생성된 모습

JPAQuery query = new JPAQuery(em); QMember qMember = new QMember("m"); // JPQL의 별칭 List members = query.from(qMember) .where(qMember.name.eq("회원1")) .orderBy(qMember.name.desc()) .list(qMember);

코드에서 QueryDSL로 작성된 쿼리인데

별 다른 설명이 필요없이 어떤 SQL를 생성할지 알수 있다.

/* select m from Member m where m.name = ?1 order by m.name desc */ select member0_.MEMBER_ID as MEMBER_I1_0_, member0_.USER_NAME as USER_NAM2_0_, member0_.TEAM_ID as TEAM_ID3_0_ from Member member0_ where member0_.USER_NAME=? order by member0_.USER_NAME desc

3. 엔티티 별칭

@Generated("com.mysema.query.codegen.EntitySerializer") public class QMember extends EntityPathBase { private static final long serialVersionUID = -477194304L; private static final PathInits INITS = PathInits.DIRECT2; // 기본 별칭이 있다. public static final QMember member = new QMember("member1"); public final NumberPath id = createNumber("id", Integer.class); public final StringPath name = createString("name");

QueryDSL로 생성된 메타모델의 코드를 보면 자체적으로 기본 별칭이 정해져있다.

그렇기 때문에 아래와 같이 생성해도 된다.

ps. 여기서 말한 별칭이란 Alias 같은 개념으로 엔티티끼리 조인을 하게될 경우 구분자를 말한다.

// 둘다 같은 의미다. QMember qMember = new QMember("member1"); QMember qMember = QMember.member;

from http://tony950620.tistory.com/126 by ccl(A) rewrite - 2021-11-15 22:27:21