Di seguito è la soluzione che ho trovato. Quindi, solo per ricapitolare, il problema che avevo era che non volevo eseguire una query data un oggetto Query come input per avere una maggiore flessibilità sui criteri di filtro. La soluzione si è rivelata abbastanza semplice, ho dovuto solo leggere attentamente la documentazione :).
- passo
Estende MongoRepository e aggiungi le tue funzioni personalizzate:
@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {
Page<T> findAll(Query query, Pageable pageable);
}
- passo
Crea un'implementazione per questa interfaccia:
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())
);
}
}
- passo
Imposta la tua implementazione come implementazione MongoRepository predefinita:
@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
public static void main(final String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
}
- passo
Crea un repository per il tuo oggetto personalizzato:
public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}
Ora se hai più oggetti che vuoi salvare in un archivio di documenti mongo, è sufficiente definire un'interfaccia che estenda il tuo ResourceRepository
(come visto nel passaggio 4), e avrai a disposizione la Page<T> findAll(Query query, Pageable pageable)
metodo di query personalizzato. Ho scoperto che questa soluzione è la più elegante tra quelle che ho provato.
Se hai suggerimenti per miglioramenti, condividili con la community.
Saluti, Christian