在阅读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>
upper
或concat
或'||'
或'+'
等SQL函数在DB2中执行转换杀死性能我想要的是能够做一些像......
<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但#{}
似乎不会出现,除非有某种方法可以欺骗它。
答案 0 :(得分:12)
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 :(得分:1)
我也遇到了同样的问题。但我没有找到任何解决方案。所以我不得不从调用函数中预处理#{name}
参数。