Después de actualizar a spring data mongodb 1.10.1, recibo errores cuando ejecuto consultas como:
@Query("{$and :[" + "{ $or : [ { $where: '?0 == null' } , { 'field1' : ?0 } ] }," + "{ $or : [ { $where: '?1 == null' } , { 'field2' : ?1 } ] }," + "]}") public Page<Entity> findAll(String param1, String param2)Al verificar el error, veo que el parámetro dentro de la cláusula where no está citado y, como resultado, obtengo:
org.springframework.data.mongodb.UncategorizedMongoDbException: la consulta falló con el código de error 139 y el mensaje de error 'ReferenceError: test_param_value no está definido:
He visto algunas respuestas aquí que recomiendan esta forma de manejar parámetros opcionales (( spring-data-mongo - ¿parámetros de consulta opcionales? )) pero ya no funciona y parece que no puedo encontrar nada en el registro de cambios de versión.
En caso de que alguien más esté interesado, logré encontrar una solución después de verificar un ticket similar en el proyecto Spring Data.
Parece que la forma en que estaba comprobando los parámetros nulos en la consulta no es una buena práctica. Esto es de un comentario de un desarrollador de Spring: "los marcadores de posición no están diseñados para componer claves/valores sino para vincular parámetros. Más allá de eso, el uso de marcadores de posición en cadenas entrecomilladas siempre es problemático en términos de escape. El uso de SpEL debería satisfacer sus necesidades".
Así que terminé usando SpEL para hacer las comprobaciones de los parámetros y funciona bien. Así es como se ve:
@Query("{$and :[" + "?#{ [0] == null ? { $where : 'true'} : { 'field1' : [0] } }," + "?#{ [1] == null ? { $where : 'true'} : { 'field2' : [1] } }," + "]}") public Page<Entity> findAll(String param1, String param2, Pageable pageable);