Voici la solution que j'ai trouvée. Donc, pour récapituler, le problème que j'ai eu, c'est que je ne pouvais pas exécuter une requête avec un objet Query en entrée pour avoir une flexibilité accrue sur les critères de filtrage. La solution s'est avérée assez simple, j'ai juste dû lire attentivement la documentation :).
- étape
Étend MongoRepository et ajoute vos fonctions personnalisées :
@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {
Page<T> findAll(Query query, Pageable pageable);
}
- étape
Créez une implémentation pour cette 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())
);
}
}
- étape
Définissez votre implémentation comme implémentation par défaut de MongoRepository :
@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
public static void main(final String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
}
- étape
Créez un dépôt pour votre objet personnalisé :
public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}
Maintenant, si vous avez plusieurs objets que vous souhaitez enregistrer dans un magasin de documents mongo, il suffit de définir une interface qui étend votre ResourceRepository
(comme vu à l'étape 4), et vous aurez à disposition le Page<T> findAll(Query query, Pageable pageable)
méthode de requête personnalisée. J'ai trouvé que cette solution était la plus élégante de la solution que j'ai essayée.
Si vous avez des suggestions d'amélioration, n'hésitez pas à les partager avec la communauté.
Cordialement, Christian