Spring Bootでデータベースを使う記事を書きました。記事中で軽く触れたCustomクラスを作る方法です。

前提

こんなEntityとRepositoryインターフェースがあったとします。

User.java

@Entity
public class User {
  // いろいろ
}

UserRepository.java

public interface UserRepository extends CrudRepository<User> {
}

やること

ステップ1 - Customインターフェースを作成する

名前は必ず__Repositoryインターフェース名 + ‘Custom’__にします。

UserRepositoryCustom.java

public interface UserRepositoryCustom {
  public List<User> findBySpec(String prop);
}

ステップ2 - Customインターフェースの実装を作成する

名前は必ず__Repositoryインターフェース名 + ‘Impl’__にします。

UserRepositoryImpl.java

public class UserRepositoryImpl implements UserRepositoryCustom {
  public List<User> findBySpec(String prop) {
    // いろいろ
  }
}

ステップ3 - RepositoryインターフェースにCustomインターフェースを継承させる

UserRepository.java

public interface UserRepository extends
  CrudRepository<User>, UserRepositoryCustom {
}

Customインターフェースの実装について

EntityManagerを使う

@AutowiredJpaContextを取得します。

JpaContextから、EntiyManagerを取得します。

UserRepositoryImpl.java

  @Autowired
  private JpaContext context;

  public List<User> findBySpec(String prop) {
    final EntityManager em = context.GetEntityManagerByManagedType(User.class);

    // いろいろ
  }

Repositoryインターフェースを使う

普通に@Autowiredすると入ってきます。
よくできてますね。

UserRepositoryImpl.java

  @Autowired
  private UserRepository repository;