db2 - resultmap - mybatis unpooled
Cómo aplicar un método a un parámetro en MyBatis (2)
Después de leer acerca de los XML de Mapper, no puedo evitar preguntarme cómo se podría aplicar algunas transformaciones comunes a un parámetro. Por ejemplo...
<select id="selectPerson" parameterType="String" resultType="hashmap">
<!-- #{name} should always be upper case and have a trailing % -->
SELECT * FROM PERSON WHERE FIRST_NAME like #{name}
</select>
Después de leer esto y esto , puedo hacer algunas observaciones.
- Usar funciones de SQL como
upper
oconcat
o''||''
o''+''
para hacer transformaciones mata el rendimiento en DB2 - Siempre podría envolver el mapeador o exponer los detalles en la capa de servicio, pero eso parece desordenado
Lo que quiero es poder hacer algo como ...
<select id="selectPerson" parameterType="String" resultType="hashmap">
<!-- #{name} should always be upper case and have a trailing % -->
SELECT * FROM PERSON WHERE FIRST_NAME like #{name.upperCase() + ''%''}
</select>
¿Es posible algo así o cuál es la segunda mejor solución?
Actualización: parece que MyBatis usa OGNL para alguna evaluación de expresión. Por ejemplo, las expresiones if
y ${}
usan OGNL, pero #{}
NO aparece a menos que haya alguna forma de engañarlo.
Enlazar
MyBatis permite crear valores a partir del método y las propiedades en el contexto usando <bind/>
.
Bind crea una nueva variable en el alcance de la declaración actual. La instrucción OGNL que vincula el valor puede usar el objeto _parameter
in _parameter
para calcular un nuevo valor enlazado que luego MyBatis puede usar para construir la instrucción preparada.
Ejemplo
Tu ejemplo usando bind:
<select id="selectPerson" parameterType="String" resultType="hashmap">
<!-- #{name} should always be upper case and have a trailing % -->
<bind name="nameStartsWith" value="_parameter.getName().upperCase() + ''%''"/>
SELECT * FROM PERSON WHERE FIRST_NAME like #{nameStartsWith}
</select>
Fuente
También encontré el mismo problema. Pero no encontré ninguna solución para esto. Así que tuve que preprocesar el parámetro #{name}
de la función de llamada.