2012-08-14 31 views
6

tengo un SQL escrito en un archivo mapeador MyBatis que es algo como esto:Acceso cadena public static final en mybatis SQL en archivos asignador

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

Se supone que el valor de marcador de posición para d a ser una constante declarada en un archivo llamado Constants.java como:

public static final String d = "d_value"; 

¿Cómo se sustituye el marcador de posición con el valor sin tener que pasar un parámetro en el <select> construcción? Intenté #{com.pkg.name.Constants.d} pero no funcionó.

No hard coding !!!

Respuesta

2

Con el comportamiento fuera de la caja de MyBatis, hasta donde yo sé, no se puede.

usted podría tratar de escribir un interceptor for the ParameterHandler e inyectar el valor allí, pero esto no siempre puede ser posible ya que se puede jugar solamente con dos métodos en el manejador de parámetros:

  • getParameterObject que devuelve el parámetro que se enviado a la consulta (puede ser una constante, una cadena, un mapa, un objeto personalizado o incluso nulo, como es el caso de su ejemplo en el que no envía un parámetro)
  • setParameters donde supongo que podría intentar establezca el parámetro si sabe dónde está en la declaración preparada (que la mayoría de las veces puede que no).

Mi sugerencia es pasarlo como parámetro a su consulta. Las características del interceptor de MyBatis no están muy bien documentadas, por lo que es posible que no obtenga la combinación de trabajo correcta desde el principio y puede terminar con más problemas de los que merece la pena.

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

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

+0

En realidad, esto funciona !! Pero tenga en cuenta que el valor se pega "tal cual", sin escapatoria, sin comillas. Entonces, si no lo usa para números, al menos tiene que agregar presupuestos. –

+0

En realidad, estamos reemplazando los parámetros pasados ​​en los mapeadores por esto, excepto por el hecho de que no usamos solo constantes STATICAS FINALES, sino que también puede llamar directamente a un método estático, como este: ${@foo.product.constant.StoreType @getWhereClausule()} – kensai

Cuestiones relacionadas