Hercles Posted October 26, 2023 at 07:37 PM Report Share #631977 Posted October 26, 2023 at 07:37 PM (edited) 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. Edited October 26, 2023 at 07:40 PM by Hercles Link to comment Share on other sites More sharing options...
M6 Posted October 27, 2023 at 07:46 AM Report Share #631978 Posted October 27, 2023 at 07:46 AM O erro é simples. Os valores do operador IN têm mesmo de ser separados, não podes passar direto como passas. Se criares uma string onde os elementos são separados por , e contornados por ' vais conseguir fazer o que pretendes. Basicamente fazes em código o que fizeste manualmente no teu exemplo. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
Hercles Posted October 27, 2023 at 10:10 AM Author Report Share #631982 Posted October 27, 2023 at 10:10 AM eu criei este método que coloca as aspas entre os elementos e a virgula, mas não vai tembém : public static String listToString(List<String> list) { if (list == null || list.isEmpty()) { return ""; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < list.size(); i++) { sb.append("'").append(list.get(i)).append("'"); if (i < list.size() - 1) { sb.append(","); } } return sb.toString(); } Este outro sem as aspas entre os elementros, este vai, mas so um tipo 'HIP' se coloco os dois 'HIP','JUR' não vai. public static String listToString(List<String> list) { if (list == null || list.isEmpty()) { return ""; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < list.size(); i++) { sb.append(list.get(i)); if (i < list.size() - 1) { sb.append(","); } } return sb.toString(); } Link to comment Share on other sites More sharing options...
M6 Posted October 27, 2023 at 11:58 AM Report Share #631984 Posted October 27, 2023 at 11:58 AM Se o resultado é uma string do tipo 'valor1', 'valor2' então tem de funcionar. Não podes é passar o valor via placeholder para o Oracle, tens de o injetar como literal no comando SQL. 1 Report 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
Hercles Posted October 27, 2023 at 01:53 PM Author Report Share #631985 Posted October 27, 2023 at 01:53 PM (edited) 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); Edited October 27, 2023 at 01:53 PM by Hercles Link to comment Share on other sites More sharing options...
M6 Posted October 30, 2023 at 08:57 AM Report Share #631995 Posted October 30, 2023 at 08:57 AM Para ultrapassares esse NULL basta teres um OR na clausula. Exemplo para o valoracaopropostaVAR: AND ( :valoracaopropostaVAR is NULL OR valoracaoproposta IN (:valoracaopropostaVAR) ) 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
Hercles Posted November 1, 2023 at 09:52 AM Author Report Share #632017 Posted November 1, 2023 at 09:52 AM (edited) não sei o porque esta sua forma não funciona no Oracle, deveria... Mas resolvi de outra forma. estou a usar o Oracle e deve ser por isto que não faz da forma simples… criei uma lógica para as listas 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). Edited November 1, 2023 at 10:02 AM by Hercles Link to comment Share on other sites More sharing options...
Hercles Posted November 1, 2023 at 09:55 AM Author Report Share #632018 Posted November 1, 2023 at 09:55 AM (edited) agora acho que ja sei o porque, é que deve esta esperando um null e vem [null] (suponho eu) . um null dentro de um array... bem em todos caso vou manter o que fiz, pois, me ajuda na chamada do Angular. Obrigado por me ajudar a desenvolver o raciocinio Edited November 1, 2023 at 09:56 AM by Hercles Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now