Nedan är lösningen jag har kommit fram till. Så bara för att sammanfatta, problemet som jag hade, var att jag inte kunde exekvera en fråga givet ett Query-objekt som input för att få ökad flexibilitet över filtreringskriterierna. Lösningen visade sig vara ganska enkel, jag var bara tvungen att noga läsa dokumentationen :).
- steg
Utökar MongoRepository och lägg till dina anpassade funktioner:
@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {
Page<T> findAll(Query query, Pageable pageable);
}
- steg
Skapa en implementering för detta gränssnitt:
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())
);
}
}
- steg
Ställ in din implementering som standardimplementering av MongoRepository:
@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
public static void main(final String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
}
- steg
Skapa ett arkiv för ditt anpassade objekt:
public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}
Om du nu har flera objekt som du vill spara i en mongo-dokumentbutik räcker det att definiera ett gränssnitt som utökar ditt ResourceRepository
(som ses i steg 4), och du kommer att ha tillgänglig Page<T> findAll(Query query, Pageable pageable)
anpassad frågemetod. Jag har tyckt att den här lösningen är den mest eleganta av den lösning jag har provat.
Om du har några förslag på förbättringar, vänligen dela dem med communityn.
Hälsningar, Cristian