SQL clause IN Java com List

Caros, criei um endPoint que recebe no postman credittypeVAR = HIP,JUR (que seria uma lista). Isto chega no controler certinho dentro de List(String) credittypeVar. Sendo que quando eu uso na chamada ao repositorio “AND (:credittypeVAR IS NULL OR :credittypeVAR = ‘’” OR credittype IN (:credittypeVAR))" este valor não é consultado eu tenho uma erro oracle.jdbc.OracleDatabaseException: ORA-00920: operador relacional inválido o que pode ser?

Se eu fizer “Matelado” assim “AND (:credittypeVAR IS NULL OR :credittypeVAR = ‘’” OR credittype IN (‘HIP’,‘JUR’))” Funciona. estou a usar o Oracle.

Não dá para parametrizar a clausula IN com listas ou arrays nem no JPA nem no JDBC.

O que eu faço é criar um método para transformar minha lista em uma String contendo os valores a serem consultados no IN e aí concateno essa String na query.

Na verdade dá, como ele está usando Spring esse suporte é ofertado através do Spring Data!

1 curtida

Não é possivel fazer com native query, ne?

Usando native query acredito que não é possível, neste caso você teria que tratar isso de forma programática!

Estou mudando para JPA e Hibe mas tive este erro org.springframework.orm.jpa.JpaSystemException: Unknown wrap conversion requested: java.util.ArrayList to java.lang.String : org.hibernate.type.descriptor.java.StringJavaType (java.lang.String) sabes como resolve?

fiz JPA e Hibe - quando mando so um da certo… mas mando mais de um da erro de Index: 0

Posta o seu código e o stacktrace do erro.

Usando JPA e Hibernate eu consegui desta forma… mas ainda falta uma coisa. Quando as listas forem nula ou vazia, não deveria fazer o “AND” (pesquisa por tudo) … Já tentei algumas coisas e não consegui ainda.

@Query("SELECT new ReasonCodeCounter(credittype, reasontext, reasoncode, decisionresult, SUM(total))\r\n"

+ "FROM ReasonCodeCounter\r\n"

+ "WHERE createdate >= :startDate AND createdate <= :endDate\r\n"

+ "AND (credittype IN (:credittypeVAR))\r\n"

+ "AND (decisionresult IN (:decisionresultVAR))\r\n"

+ "AND (valoracaoproposta IN (:valoracaopropostaVAR))\r\n"

+ "AND (produto IN (:produtoVAR))\r\n"

+ "AND (regiaobalcao IN (:regiaobalcaoVAR))\r\n"

+ "AND (ctransorigid IN (:ctransorigidVAR))\r\n"

+ "GROUP BY credittype, reasontext, reasoncode, decisionresult")

List<ReasonCodeCounterParent> getOccurrencesOfReasonCodesFilters(LocalDate startDate, LocalDate endDate,

List<String> credittypeVAR, List<String> decisionresultVAR, List<String> valoracaopropostaVAR, List<String> produtoVAR,

List<String> regiaobalcaoVAR, List<String> ctransorigidVAR);

estou a usar o Oracle e deve ser por isto que não faz da forma simples… criei uma logica para as litas e estou usando desta forma

  • “AND ((credittype IN (:credittypeVAR)) OR (‘todos’) IN (:credittypeVAR)) \r\n”

caso a lista venha nula ou vazia eu coloco o valor ‘todos’ (criei um metodo para isso).