2012-08-14 11 views
6

ho uno SQL scritto in un file mapper MyBatis che è qualcosa di simile:accesso stringa finale public static in mybatis SQL in file mapper

<select id="somesql"> 
    select a,b,c from tbl_name where d = ? 
</select> 

si suppone che il valore segnaposto per d ad essere una costante dichiarata in un file denominato come Constants.java:

public static final String d = "d_value"; 

come si sostituisce il segnaposto con il valore senza effettivamente passare un parametro nella costrutto <select>? Ho provato #{com.pkg.name.Constants.d} ma non ha funzionato.

No hard coding !!!

risposta

2

Con il comportamento out of the box di MyBatis, per quanto ne so, non è possibile.

Si potrebbe provare a scrivere un interceptor for the ParameterHandler e iniettare il valore lì, ma questo non può essere sempre possibile perché si può giocare solo con due metodi sul gestore dei parametri:

  • getParameterObject che restituisce il parametro che è stato inviato alla query (può essere una costante, una stringa, una mappa, un oggetto personalizzato o anche nulla come nel caso dell'esempio in cui non si invia un parametro)
  • setParameters dove immagino si possa provare a imposta il parametro se sai dove si trova sull'istruzione preparata (che la maggior parte delle volte potresti non avere).

Il mio suggerimento è di passarlo come parametro alla vostra richiesta. Le caratteristiche dell'intercettore di MyBatis non sono molto ben documentate, quindi potresti non ottenere la combinazione di lavoro corretta dall'inizio e potresti finire con più problemi di quanti ne valga la pena.

3
<select id="getConvenienceStoreList" resultType ="Store"> 
    SELECT * FROM Store 
    WHERE type = ${@[email protected]_STORE} 
    ORDER BY id 
    LIMIT #{start}, #{limit} 
</select> 

Riferimento: http://qiita.com/ApplePedlar/items/12dc389cc32f3db5557a

+0

In realtà, questo funziona !! Ma nota che il valore è incollato "così com'è", nessuna escaping, nessuna virgoletta. Quindi se non lo usi per i numeri, devi almeno aggiungere delle virgolette. –

+0

In realtà stiamo sostituendo qualsiasi parametro passato in mapper con questo, tranne il fatto, non usiamo solo costanti STATIC FINAL, ma puoi anche chiamare direttamente un metodo statico, come questo: ${@foo.product.constant.StoreType @getWhereClausule()} – kensai