Spring DATA JPA 에서 다이나믹 SQL을 처리하는 방법?
- JPA Criteria 를 사용하는 방법
- EntityManager를 직접 사용하는 방법
- QueryDSL 를 사용하는 방법
현업에서는 3번을 많이 사용한다.
QueryDSL (http://www.querydsl.com/)
(http://www.mimul.com/pebble/default/2013/06/21/1371806174467.html)
보통 DSL 이라는 붙은 기술은 소스를 생성하는 기술이 사용된다.
QueryDSL은 Domain(Entity)을 읽어들여 Q* 클래스 소스를 생성하여,
다이나믹 SQL을 사용할 수 있도록 한다.
보통 빌드도구(Maven, Gradle)에 플러그인을 설정하여 생성하도록 한다.
~~~
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.1.4</version>
</dependency>
....
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java/</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
~~~
maven에서 package를 실행
mvn package
target - generated sources - java 폴더아래에 Q* 소스가 생성된다.
RepositoryCustom 에 다이나믹SQL이 필요한 메소드를 선언
-RepositoryImpl을 구현
1) — RepositoryCustom을 구현
2) — QuerydslRepositorySupport클래스를 상속
3) — 기본생성자에서 부모생성자를 호출. 이때 Entity클래스 정보를 전달.
4) 메소드 구현시 QClass를 사용하여 구현한다.
기존의 Repository인터페이스가 —RepositoryCustom를 상속받도록 한다.