Bellow is de oplossing die ik heb bedacht. Dus om het kort samen te vatten, het probleem dat ik had, was dat ik geen query kon uitvoeren met een Query-object als invoer om meer flexibiliteit te hebben met betrekking tot de filtercriteria. De oplossing bleek vrij eenvoudig, ik moest alleen de documentatie aandachtig lezen :).
- stap
Breidt MongoRepository uit en voegt uw aangepaste functies toe:
@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {
Page<T> findAll(Query query, Pageable pageable);
}
- stap
Maak een implementatie voor deze interface:
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())
);
}
}
- stap
Stel uw implementatie in als de standaard MongoRepository-implementatie:
@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
public static void main(final String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
}
- stap
Maak een opslagplaats voor uw aangepaste object:
public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}
Als u nu meerdere objecten heeft die u in een Mongo-documentopslag wilt opslaan, volstaat het om een interface te definiëren die uw ResourceRepository
uitbreidt (zoals te zien in stap 4), en je hebt de Page<T> findAll(Query query, Pageable pageable)
beschikbaar aangepaste querymethode. Ik vond deze oplossing de meest elegante oplossing die ik heb geprobeerd.
Als je suggesties voor verbeteringen hebt, deel deze dan met de community.
Groetjes, Cristian