ベローは私が思いついた解決策です。要約すると、私が抱えていた問題は、入力としてQueryオブジェクトを指定してクエリを実行できず、フィルタリング基準の柔軟性が向上したことです。解決策は非常に単純であることが判明しました。ドキュメントを注意深く読む必要がありました:)
- ステップ
MongoRepositoryを拡張し、カスタム関数を追加します:
@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {
Page<T> findAll(Query query, Pageable pageable);
}
- ステップ
このインターフェースの実装を作成します:
public class ResourceRepositoryImpl<T, I extends Serializable> extends SimpleMongoRepository<T, I> implements ResourceRepository<T, I> {
private MongoOperations mongoOperations;
private MongoEntityInformation entityInformation;
public ResourceRepositoryImpl(final MongoEntityInformation entityInformation, final MongoOperations mongoOperations) {
super(entityInformation, mongoOperations);
this.entityInformation = entityInformation;
this.mongoOperations = mongoOperations;
}
@Override
public Page<T> findAll(final Query query, final Pageable pageable) {
Assert.notNull(query, "Query must not be null!");
return new PageImpl<T>(
mongoOperations.find(query.with(pageable), entityInformation.getJavaType(), entityInformation.getCollectionName()),
pageable,
mongoOperations.count(query, entityInformation.getJavaType(), entityInformation.getCollectionName())
);
}
}
- ステップ
実装をデフォルトのMongoRepository実装として設定します:
@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
public static void main(final String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
}
- ステップ
カスタムオブジェクトのリポジトリを作成します:
public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}
これで、mongoドキュメントストアに保存するオブジェクトが複数ある場合は、ResourceRepository
を拡張するインターフェイスを定義するだけで十分です。 (手順4で見たように)、Page<T> findAll(Query query, Pageable pageable)
が利用可能になります カスタムクエリメソッド。このソリューションは、私が試したソリューションの中で最もエレガントであることがわかりました。
改善のための提案があれば、コミュニティと共有してください。
よろしく、クリスチャン