Nedenfor er den løsning, jeg har fundet på. Så bare for at opsummere, var det problem, jeg havde, at jeg ikke ville være i stand til at udføre en forespørgsel givet et Query-objekt som input for at få øget fleksibilitet i forhold til filtreringskriterierne. Løsningen viste sig at være ret simpel, jeg skulle bare læse dokumentationen omhyggeligt :).
- trin
Udvider MongoRepository og tilføjer dine brugerdefinerede funktioner:
@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {
Page<T> findAll(Query query, Pageable pageable);
}
- trin
Opret en implementering til denne grænseflade:
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())
);
}
}
- trin
Indstil din implementering som standard MongoRepository implementering:
@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
public static void main(final String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
}
- trin
Opret et lager til dit brugerdefinerede objekt:
public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}
Hvis du nu har flere objekter, som du vil gemme i en mongo dokumentbutik, er det nok at definere en grænseflade, som udvider dit ResourceRepository
(som vist i trin 4), og du vil have Page<T> findAll(Query query, Pageable pageable)
tilpasset forespørgselsmetode. Jeg har fundet denne løsning som den mest elegante af den løsning, jeg har prøvet.
Hvis du har forslag til forbedringer, bedes du dele dem med fællesskabet.
Med venlig hilsen Cristian