Spring Data JPA で遊んでみる 〜その10〜

Spring Data JPA では Querydsl なるものがサポートされています。
http://www.querydsl.com/

色々機能があるみたいですが、カンタに言うとEntityクラスからAPTでメタ情報のクラスを生成して、そのクラスを利用してタイプセーフで流れるようにクエリが書けるようなものです。s2jdbcチックな感じです。

APTなので若干セットアップがかったるいですが。
まずpomにライブラリの追加。

    <!-- Query Dsl -->
    <dependency>
      <groupId>com.mysema.querydsl</groupId>
      <artifactId>querydsl-jpa</artifactId>
      <version>2.2.3</version>
    </dependency>
    <dependency>
      <groupId>com.mysema.querydsl</groupId>
      <artifactId>querydsl-apt</artifactId>
      <version>2.2.3</version>
      <scope>provided</scope>
    </dependency>

mavenでaptを実行するようにしておきます。

      <plugin>
        <groupId>com.mysema.maven</groupId>
        <artifactId>maven-apt-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <phase>generate-sources</phase>
            <goals>
              <goal>process</goal>
            </goals>
            <configuration>
              <outputDirectory>target/generated-sources</outputDirectory>
              <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
            </configuration>
          </execution>
        </executions>
      </plugin>

ついでにソースを追加するあれをいれておくとよい。

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>add-source</id>
            <phase>compile</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>target/generated-sources</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>

最近はm2eの仕組みが色々と変わってEclipseで連携する場合は色々とめんどい。。。ので書きません。

良い感じにソースコードが自動生成されるようになったらリポジトリにQueryDslPredicateExecutorを継承させます。

public interface EmpRepository extends QueryDslPredicateExecutor<Emp>

QueryDslPredicateExecutorに定義されているのは以下のメソッド

T findOne(Predicate predicate);
Iterable<T> findAll(Predicate predicate);
Iterable<T> findAll(Predicate predicate, OrderSpecifier<?>... orders);
Page<T> findAll(Predicate predicate, Pageable pageable);
long count(Predicate predicate);

使うときは自動生成されたメタクラスを使用しつつクエリを組み立てて食わせます。

@Test
public void Querydslを使う() throws Exception {
    Iterable<Emp> emps = repository.findAll(QEmp.emp.id.lt(9L).and(QEmp.emp.dept.id.eq(1L)));
}

サンプルはこんなん
https://github.com/yamkazu/springdata-jpa-example/tree/querydsl