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

ここまで紹介てきたクエリの発火方法で、恐らくほとんどのことができるんじゃないかと思います。ただ、どうしても自分で実装を持ちたくなるような時もあります。

Spring Data JPA では定義したリポジトリのインタフェースに対し、独自の拡張クラスを作成することができます。

まず拡張したいメソッドを定義したインタフェースを用意します。

public interface EmpRepositoryCustom {
    String echo(String message);
}

拡張メソッドだけを定義したインタフェースを個別に起こしているところに注意してください。

これをリポジトリのインタフェースに継承させます。

public interface EmpRepository extends EmpRepositoryCustom {

インタフェースの準備はこれで終わりです。実装くらすはEmpRepositoryCustomを実装しつつクラス名をリポジトリ名+Implとなるようにします。このルールは変えられますし、独自にSpringのBeanとして個別に定義することもできます。詳しくはマニュアルを参照してください。

実装クラスはこんなんです。

public class EmpRepositoryImpl implements EmpRepositoryCustom {
    @Override
    public String echo(String message) {
        return message;
    }
}

ちょっとインタフェースの定義が、独自メソッドだけ切り出してインタフェースを別に起こさないといけないなど、手間な感じが最初はしたのですが、一貫して基底となるインタフェースで、他のインタフェースを継承することで機能拡張が行えるというスタイルな感じがして、これはこれでmixinポイ感じで統一感があるのかなぁと思いました。これはJpaRepositoryを継承すればJPAの機能が、JpaSpecificationExecutorを継承すればSpecificationの機能が、QueryDslPredicateExecutorを継承すればQueryDslの機能が、独自のインタフェースを継承すれば独自の機能がという感じです。

サンプル
https://github.com/yamkazu/springdata-jpa-example/tree/customimpl