Estou executando uma consulta JPA não nativa, que retorna um objeto personalizado.
@Query("""
SELECT
new path.to.CustomObject(
t,
(select id from users where name = :param1)
(select id from departments where name IN (:param2))
)
FROM timesheets t
WHERE status = :param3
)
Page<CustomObject> getAll(
@Param("param1") String param1,
@Param("param2") List<String> param2,
@Param("param3") String param3,
Pageable pageable
)
Quando executo a consulta com paginação padrão (tamanho = 10, página = 0), o registrador imprimirá:
o.s.d.j.r.q.QueryParameterSetter$ErrorHandling: Silently ignoring
java.lang.IllegalArgumentException: Could not locate named parameter [param1], expecting one of [param3]
java.lang.IllegalArgumentException: Could not locate named parameter [param2], expecting one of [param3]
Mas a consulta funciona perfeitamente e retorna os valores corretos, incluindo os das subconsultas. Se eu executar a mesma consulta com um tamanho de página maior (tamanho 30, página = 0), a consulta ainda funciona bem e sem erros. Se eu adicionar uma condição where simples abaixo, por exemplo:
[...]
FROM timesheets t
WHERE status = :param3
AND :param1 = :param1
AND :param2 = :param2
O erro só será gerado param2
porque é uma lista. Parece que os parâmetros usados dentro de uma subconsulta são ignorados, mas não consigo entender por que esse truque simples não funciona também para listas.
Gostaria de evitar imprimir exceções "falsas" no registro (já que elas não bloqueiam a execução), então estou procurando uma solução alternativa (como colocá-las em uma condição WHERE sempre verdadeira) ou uma maneira de impedir que o Spring registre as exceções ignoradas silenciosamente.
Você pode usar a propriedade abaixo em seu application.properties para suprimir logs de vinculação de parâmetros detalhados no Spring Data JPA.
Isso ajuda a manter seus logs limpos, mostrando apenas erros durante a vinculação de parâmetros de consulta, o que é especialmente útil em ambientes de produção.