web-dev-qa-db-ja.com

Spring Dataで読み取り専用リポジトリを作成する

Spring Dataを使用して読み取り専用リポジトリを作成することは可能ですか?

ビューにリンクされているエンティティと、findAll()findOne()などのいくつかのメソッドと_@Query_ annotationを持ついくつかのメソッドをリポジトリに提供したいいくつかの子エンティティがあります。 save(…)delete(…)などのメソッドは、意味がなく、エラーが発生する可能性があるため、提供を避けたいと思います。

_public interface ContactRepository extends JpaRepository<ContactModel, Integer>, JpaSpecificationExecutor<ContactModel> {
    List<ContactModel> findContactByAddress_CityModel_Id(Integer cityId);

    List<ContactModel> findContactByAddress_CityModel_Region_Id(Integer regionId);

    // ... methods using @Query

    // no need to save/flush/delete
}
_

ありがとう!

26
jpboudreault

はい、行く方法は手作りのベースリポジトリを追加することです。通常、次のようなものを使用します。

public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> {

  T findOne(ID id);

  Iterable<T> findAll();
}

これで、定義したリポジトリを具体的なリポジトリに拡張することができます。

public interface PersonRepository extends ReadOnlyRepository<Person, Long> {

  T findByEmailAddress(String emailAddress);
}

基本リポジトリを定義する重要な部分は、メソッド宣言がCrudRepositoryで宣言されたメソッドと非常に同じシグネチャを運ぶことです。それでも、リポジトリプロキシをサポートする実装Beanに呼び出しをルーティングできます。 SpringSourceブログで、そのトピックについてより詳細な ブログ投稿 を記述しました。

49
Oliver Drotbohm

Oliver Gierkeの回答を拡張するには、Spring Dataの最近のバージョンでは、アプリケーションの起動エラーを防ぐために、ReadOnlyRepository(親インターフェース)に@NoRepositoryBeanアノテーションが必要になります。

import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.Repository;

@NoRepositoryBean
public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> {

    T findOne(ID id);

    List<T> findAll();

}
26
Tristan Perry

ドキュメントで確認できる限り、これは org.springframework.data.repository.Repository を実装することで可能です。

7

私にとっては次のことがうまくいきました。オリバーのソリューションを使用して、エラーが発生しましたInvocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property findOne found for type起動中。

@NoRepositoryBean
public interface ReadOnlyRepository<T,ID> extends Repository<T, ID> {
    Optional<T> findById(ID var1);
    boolean existsById(ID var1);
    Iterable<T> findAll();
    Iterable<T> findAllById(Iterable<ID> var1);
    long count();
}
2
Iqbal