Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [java, Ibatis] Clausola sql ' where .. IN .. '

    Sto usando Ibatis con Java per definire e usare delle query, in genere va tutto bene.

    Ho dei problemi solo nell'utilizzo della clausola sql 'in', cioe' ad es. :

    SELECT * from tab where colonna IN (val1 val2, ..)

    Non riesco a far interpretare correttamente a Ibatis una query con questa clausola,
    nonostante i numerosi tentativi, con sintassi varia ma che poi non funziona,
    nel senso che Ibatis non riesce ad interpretare correttamente la query.

    Ho quasi il sospetto che ci sia qualche baco in Ibatis anche perche' la soluzione piu' brutale,
    di creare una stringa che contiene tutti i valori, separati da virgole, non funziona.

    Nemmeno la soluzione piu' naturale e proposta in genere, cioe' di creare una lista con i valori da mettere nella clausola 'IN' funziona.


    Ecco alcuni dei tentativi:

    xml:


    <statement id="query" resultClass="String">
    select
    c.*, m.idrichiesta
    from
    :nomeTab: c, cont m
    where m.codsocieta = c.codsocieta
    1) lista
    2) stringona : ('aa', 'bb')
    3) di nuovo una lista
    ......


    grazie per eventuali suggerimenti....

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    non consco ibatis, ma per sistemare fintanto che (se li hai contattati) non ricevi una risposta, considera la clausola WHERE IN lista una contrazione di una serie di OR... quindi la soluzione casereccia è quella di creare una lunga lista di OR e riscrivere la query:

    codice:
    SELECT * FROM tbl WHERE (colonna = val_1 OR colonna = val_2 ... OR colonna = val_n)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Non conosco ibatis ma conosco un pochino google:
    Link

  4. #4
    avevo gia' fatto una prova in questo senso, di creare una stringa con una serie di or, pero' sembrava che ibatis non la decodificasse. Non so se sia dovuto al fatto che il campo della tabella a cui si riferiscono i valori e' un Numerico, e non so se in questo caso sia meglio indicare i valori come interi o come stringhe. Cioe' se sia meglio, dal punto di vista ibatis, cosi' :

    (val = '23' or val = '34' or ...)

    oppure:

    (val = 23 or val = 34 or ...)


    p.s. : (grazie anche per la segnalazione di un sito cosi' utile come Google !)

  5. #5
    Io invece conosco e uso anche IBATIS, il seguente è un esempio di codice (tratto da una sqlmap funzionante) che fa ciò che chiedi:

    codice:
    ....
    ....altro sql
    ....and status_id <iterate open="IN (" close=")"  conjunction="," property="status">#status[]#</iterate>
    dove il parametro status è stato dichiarato (dal DAO che usa la mappa) come :

    codice:
    List<Integer> status = ....
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Originariamente inviato da unomichisiada
    Io invece conosco e uso anche IBATIS, il seguente è un esempio di codice (tratto da una sqlmap funzionante) che fa ciò che chiedi:

    codice:
    ....
    ....altro sql
    ....and status_id <iterate open="IN (" close=")"  conjunction="," property="status">#status[]#</iterate>
    dove il parametro status è stato dichiarato (dal DAO che usa la mappa) come :

    codice:
    List<Integer> status = ....
    Che è esattamente quello che viene fatto nel esempio che avevo linkato

  7. #7
    Originariamente inviato da francesco.muia
    Che è esattamente quello che viene fatto nel esempio che avevo linkato
    Si, ho voluto semplicemente confermare con un esempio sicuramente funzionante (dato che è tutt'ora in produzione su un grosso sistema).
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  8. #8
    grazie per le risposte, ci deve essere pero' un problema applicativo (sto intervenendo su di un pacchetto gia' fatto), che impedisce al metodo che avete presentato sopra, che e' il piu' logico, di funzionare correttamente, e che per ora non riesco a trovare...

    per il momento provo di nuovo il metodo piu' rozzo, che e' di creare una grossa stringa contenente la clausola : 'IN (nn, mm, pp, ...)', definita nell'sql map come una sola stringa, e che deve per forza funzionare...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.