Abaixo está a solução que eu encontrei. Então, apenas para recapitular, o problema que eu tive foi que eu não conseguia executar uma consulta com um objeto Query como entrada para aumentar a flexibilidade sobre os critérios de filtragem. A solução acabou por ser bastante simples, bastava ler atentamente a documentação :).
- passo
Estende o MongoRepository e adiciona suas funções personalizadas:
@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {
Page<T> findAll(Query query, Pageable pageable);
}
- passo
Crie uma implementação para esta 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())
);
}
}
- passo
Defina sua implementação como a implementação padrão do MongoRepository:
@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
public static void main(final String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
}
- passo
Crie um repositório para seu objeto personalizado:
public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}
Agora, se você tiver vários objetos que deseja salvar em um armazenamento de documentos do mongo, basta definir uma interface que estenda seu
ResourceRepository
(como visto na etapa 4), e você terá disponível a Page<T> findAll(Query query, Pageable pageable)
método de consulta personalizado. Eu encontrei esta solução para ser a mais elegante da solução que eu tentei. Se você tiver sugestões de melhorias, compartilhe-as com a comunidade.
Atenciosamente, Cristiano