Jump to content

SQL clause IN Java com List


Hercles

Recommended Posts

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 by Hercles
Link to comment
Share on other sites

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

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

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.

  • Vote 1
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

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 by Hercles
Link to comment
Share on other sites

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

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 by Hercles
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.