2012-01-06 12 views
15

C'è una query nei miei Mybatis contenente una clausola in cui è fondamentalmente un insieme di di Id (interi)Come passare un array di interi a clausola in MyBatis

ora sto bloccato su come posso passare un intero array a questa clausola IN in modo che recuperi i record appropriati. Provato passando una stringa contenente gli ID alla clausola IN, ma questo non ha funzionato come previsto.

Codice Esempio

Mybatis metodo utilizzando le annotazioni

@Select(SEL_QUERY) 
    @Results(value = {@Result(property="id",column="ID")}) 
    List<Integer> getIds(@Param("usrIds") Integer[] usrIds); 

query

select distinct ID from table a where a.id in (#{usrIds}) 

metodo di chiamata

Integer[] arr = new Integer[2]; 
arr[0] = 1; 
arr[1] = 2; 

mapper.getIds(arr) 

Questo non funziona, Mybatis genera un errore wh it chiamo il metodo mapper

Qualche suggerimento per favore

risposta

26

Il myBatis User Guide on Dynamic SQL ha un esempio su come utilizzare un ciclo foreach per costruire la stringa di query, che lavora per le liste e array.

Prima della versione 3.2 è stato necessario utilizzare la configurazione xml per utilizzare SQL dinamico, con le versioni più recenti dovrebbe anche essere possibile utilizzare dynamic sql in annotations.

<select id="selectPostIn" resultType="domain.blog.Post"> 
    SELECT * 
    FROM POST P 
    WHERE ID in 
    <foreach item="item" index="index" collection="list" 
      open="(" separator="," close=")"> 
     #{item} 
    </foreach> 
</select> 
+0

Grazie per il suggerimento, lo controllerò e aggiornerò lo spazio qui – Vivek

+1

In realtà, funziona anche con le annotazioni a patto che la stringa di query inizi con '

3

Sì, è possibile farlo utilizzando le annotazioni.

Se si utilizza postgresql, è possibile fare come in this post.

Se stai usando MySQL provare questo cambia nel codice di esempio:

Mybatis metodo utilizzando le annotazioni

@Select(SEL_QUERY) 
    @Results(value = {@Result(property="id",column="ID")}) 
    List<Integer> getIds(@Param("usrIds") String usrIds); 

Query (utilizzando MySQL)

select distinct ID from table a where FIND_IN_SET(a.id, #{usrIds}) <> 0 

chiamata al metodo

Integer[] arr = new Integer[2]; 
arr[0] = 1; 
arr[1] = 2; 

String usrIds= ""; 
for (int id : ids) { 
    usrIds += id + ","; 
} 

mapper.getIds(usrIds) 
+0

esattamente ciò di cui avevo bisogno – deeshank

+1

Una nota importante qui è che FIND_IN_SET non utilizzerà gli indici quindi è probabile che questa versione abbia un rendimento peggiore di un'istruzione IN – Zack

Problemi correlati