unpooled resultmap example conexiones con anotaciones db2 mybatis ognl

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.

  1. Usar funciones de SQL como upper o concat o ''||'' o ''+'' para hacer transformaciones mata el rendimiento en DB2
  2. 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.