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.