Poniżej jest rozwiązanie, które wymyśliłem. Podsumowując, problem, który miałem, polegał na tym, że nie mogłem wykonać zapytania z obiektem Query jako danymi wejściowymi, aby mieć większą elastyczność w zakresie kryteriów filtrowania. Rozwiązanie okazało się dość proste, po prostu musiałem dokładnie przeczytać dokumentację :).
- krok
Rozszerza MongoRepository i dodaje własne funkcje:
@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {
Page<T> findAll(Query query, Pageable pageable);
}
- krok
Utwórz implementację dla tego interfejsu:
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())
);
}
}
- krok
Ustaw swoją implementację jako domyślną implementację MongoRepository:
@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
public static void main(final String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
}
- krok
Utwórz repozytorium dla swojego niestandardowego obiektu:
public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}
Teraz, jeśli masz wiele obiektów, które chcesz zapisać w magazynie dokumentów mongo, wystarczy zdefiniować interfejs, który rozszerza twoje ResourceRepository
(jak widać w kroku 4), a będziesz mieć dostęp do Page<T> findAll(Query query, Pageable pageable)
niestandardowa metoda zapytania. Uważam, że to rozwiązanie jest najbardziej eleganckim rozwiązaniem, które wypróbowałem.
Jeśli masz jakieś sugestie dotyczące ulepszeń, podziel się nimi ze społecznością.
Pozdrawiam, Christianie