MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Consultas dinâmicas do MongoRepository


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 :).
  1. 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);
}
  1. 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())
        );
    }
}
  1. 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);
    }
}
  1. 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