36

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

findAll()ビューにリンクされたいくつかのエンティティと、いくつかのメソッドを含むリポジトリを提供したいいくつかの子エンティティと、注釈findOne()付きのいくつかのメソッドがあります。andのようなメソッドは意味がなく、エラーが発生する可能性が@Queryあるため、提供することは避けたいと思います。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
}

ありがとう!

4

6 に答える 6

66

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

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 ブログで、このトピックに関するより詳細なブログ投稿を書きました。

于 2012-06-20T13:04:11.790 に答える
35

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();

}
于 2016-05-18T10:54:29.390 に答える
7

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

于 2012-06-19T18:42:14.517 に答える
4

私にとっては、次のことがうまくいきました。Oliver のソリューションを使用すると、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();
}
于 2018-05-15T10:19:54.893 に答える