Как применить метод к параметру в MyBatis - PullRequest
3 голосов
/ 08 февраля 2012

После прочтения о Mapper XMLs Я не могу не задаться вопросом, как можно применить некоторые распространенные преобразования к параметру.Например ...

<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> 

После прочтения это и это я могу сделать некоторые наблюдения.

  1. Используя такие функции SQLкак upper или concat, или '||', или '+', чтобы выполнить преобразование, убивающее производительность в DB2
  2. . Я всегда мог обернуть маппер или раскрыть детали в слое обслуживания, но это выглядит грязно

То, что я хочу, это иметь возможность делать что-то вроде ...

<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> 

Возможно ли что-то подобное или какое второе лучшее решение?

Обновление: похоже, что MyBatis использует OGNL для некоторой оценки выражения.Например, выражения if и ${} используют OGNL, но #{} НЕ появляется, если нет какого-либо способа его обмануть.

Ответы [ 2 ]

12 голосов
/ 07 июня 2013

Bind

MyBatis позволяет создавать значения из метода и свойств в контексте, используя "><bind/>.

Bind создает новую переменную в области действия текущего оператора. Оператор OGNL, который связывает значение, может использовать переданный в _parameter объект для вычисления нового связанного значения, которое затем может использоваться MyBatis для создания подготовленного оператора.


Пример

Ваш пример использования 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>

Источник

1 голос
/ 08 февраля 2012

Я тоже столкнулся с этой проблемой. Но я не нашел никакого решения для этого. Поэтому мне пришлось предварительно обработать параметр #{name} из вызывающей функции.

...