starter springframework query org mongotemplate mongo data annotation java spring mongodb spring-data

java - springframework - spring mongodb repository



spring-data-mongo-parámetros de consulta opcionales? (3)

Estoy usando spring-data mongo con los métodos de consulta basados ​​en JSON, y no estoy seguro de cómo permitir parámetros opcionales en una consulta de búsqueda.

Por ejemplo, di que tenía la siguiente función

@Query("{ ''name'' : {$regex : ?0, $options : ''i''}, ''createdDate'' : {$gte : ?1, $lt : ?2 }} }") List<MyItem> getItemsLikeNameByDateRange(String name, Date startDateRange, Date endDateRange);

-pero no quería aplicar el nombre de coincidencia de expresiones regulares, o no aplicar una restricción de rango de fechas si se pasaron valores NULOS al método.

Por el momento, parece que debería crear la consulta utilizando mongoTemplate.

¿Hay alguna alternativa, o está utilizando mongoTemplate como la mejor opción?

Gracias


Para implementar esto en lógica booleana, hago lo siguiente y la conversión a operaciones que están disponibles en lenguajes de programación

:query != null -> field == :query !(:query != null) || (field == :query) (:query == null) || (field == :query)

En SQL puro, esto se hace como

where (null = :query) or (field = :query)

En MongoDB esto se hace a través del $ donde

{ $where: ''?0 == null || this.field == ?0'' }

Podemos acelerar esto un poco utilizando Operaciones Mongo en lugar de construir todo para la función a expensas de cierta legibilidad. no funciona desafortunadamente

{ $or : [ { $where: ''?0 == null'' } , { field : ?0 } ] }

Entonces lo que tienes es

@Query("{ $or : [ { $where: ''?0 == null'' } , { field : ?0 } ] }") List<Something> findAll(String query, Pageable pageable);

Esto se puede expandir aún más para manejar arreglos para todas las cláusulas

@Query("{ $or : [ { $where: ''?0.length == 0'' } , { field : { $in : ?0 } } ] }") List<Something> findAll(String query, Pageable pageable);


Es posible que le interese proporcionar comentarios o votar sobre este tema: https://jira.springsource.org/browse/DATAJPA-209.

Se trata exactamente de este problema., Excepto para SD JPA. Parece que sería apropiado para muchos otros subproyectos SD.


El ticket dado se ocupa de los buscadores que generan su SQL por "nombre mágico", por ejemplo, findByTitleAndSubtitle (), que ahora funciona bien. Pero todavía existe el mismo problema cuando anota este buscador con @Query ("seleccionar producto donde title =: title and subtitle =: subtitle"); los valores nulos se traducen en "subtítulo = nulo", y por lo tanto no se encontrarán.