sql >> Base de Datos >  >> NoSQL >> MongoDB

Consultas dinámicas de MongoRepository

Bellow es la solución que he encontrado. Entonces, para recapitular, el problema que tuve fue que no podía ejecutar una consulta dado un objeto Query como entrada para tener una mayor flexibilidad sobre los criterios de filtrado. La solución resultó ser bastante simple, solo tuve que leer detenidamente la documentación :).

  1. paso

Extiende MongoRepository y agrega tus funciones personalizadas:

@NoRepositoryBean
public interface ResourceRepository<T, I extends Serializable> extends MongoRepository<T, I> {

    Page<T> findAll(Query query, Pageable pageable);
}
  1. paso

Cree una implementación para esta interfaz:

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. paso

Establezca su implementación como la implementación predeterminada de MongoRepository:

@EnableMongoRepositories(repositoryBaseClass = ResourceRepositoryImpl.class)
public class MySpringApplication {
    public static void main(final String[] args) {
        SpringApplication.run(MySpringApplication.class, args);
    }
}
  1. paso

Cree un repositorio para su objeto personalizado:

public interface CustomObjectRepo extends ResourceRepository<CustomObject, String> {
}

Ahora, si tiene varios objetos que desea guardar en un almacén de documentos mongo, basta con definir una interfaz que amplíe su ResourceRepository (como se ve en el paso 4), y tendrá disponible el Page<T> findAll(Query query, Pageable pageable) método de consulta personalizado. He encontrado que esta solución es la más elegante de las que he probado.

Si tiene sugerencias para mejorar, compártalas con la comunidad.

Saludos, Cristian