Níže je řešení, na které jsem přišel. Takže jen pro rekapitulaci, problém, který jsem měl, byl ten, že nejsem schopen provést dotaz daný objektem Query jako vstupem, abych měl zvýšenou flexibilitu ohledně kritérií filtrování. Řešení se ukázalo jako celkem jednoduché, jen jsem si musel pečlivě přečíst dokumentaci :).
- krok
Rozšiřuje MongoRepository a přidává vaše vlastní funkce:
@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {
Page<T> findAll(Query query, Pageable pageable);
}
- krok
Vytvořte implementaci pro toto rozhraní:
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
Nastavte svou implementaci jako výchozí implementaci MongoRepository:
@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
public static void main(final String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
}
- krok
Vytvořte úložiště pro svůj vlastní objekt:
public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}
Nyní, pokud máte více objektů, které chcete uložit do úložiště dokumentů mongo, stačí definovat rozhraní, které rozšíří váš ResourceRepository
(jak je vidět v kroku 4) a budete mít k dispozici Page<T> findAll(Query query, Pageable pageable)
metoda vlastního dotazu. Zjistil jsem, že toto řešení je nejelegantnější z řešení, které jsem vyzkoušel.
Pokud máte nějaké návrhy na vylepšení, sdílejte je s komunitou.
S pozdravem, Cristian