Tom*_*mer 13 string enums ibatis dynamic-sql mybatis
如何基于枚举常量参数在myBatis 3.1.1中执行动态SQL?
Tom*_*mer 17
如何基于枚举常量进行动态SQL
public enum Test {
A, B;
}
Mapper.java:
int test(@Param("t") Test t);
Mapper.xml:
<select id="test" resultType="int">
select
<choose>
<when test='t.name().equals("A")'>65</when>
<when test='t.name().equals("B")'>66</when>
<otherwise>0</otherwise>
</choose>
</select>
Run Code Online (Sandbox Code Playgroud)
笔记
MyBatis允许==而不是equals在if(或when)语句中使用字符串。因此,以下内容也可以工作(引号无关紧要):
public enum Test {
A, B;
}
Run Code Online (Sandbox Code Playgroud)
Mapper.java:
int test(@Param("t") Test t);
Run Code Online (Sandbox Code Playgroud)
Mapper.xml:
<select id="test" resultType="int">
select
<choose>
<when test="t.name() == 'A'">65</when>
<when test="t.name() == 'B'">66</when>
<otherwise>0</otherwise>
</choose>
</select>
Run Code Online (Sandbox Code Playgroud)
除了 Tomer 的答案(效果很好)之外,您还可以使用OGNL表示法比较枚举值。
(直接比较枚举值具有编译时优势,即,如果更改枚举成员,查询将很快失败。)
如果 Test 枚举作为公共类 Test.java 存在于 full.package.name 中,那么在 mapper.xml 中,您将拥有:
<when test='t == @full.package.name.Test@A'>
Run Code Online (Sandbox Code Playgroud)
如果 Test 枚举在另一个类中,如下所示:
package full.package.name;
public class ExampleClass {
public enum Test {
A, B
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在 mapper.xml 中,您将拥有:
<when test='t == @full.package.name.ExampleClass$Test@A'>
Run Code Online (Sandbox Code Playgroud)
OGNL 规范中没有记录 $ 符号,我在 MyBatis 问题页面中找到了它
PS:如果 OGNL 字符串不正确(例如 NullPointerException),旧版本的 MyBatis(例如,3.2.3)会显示丑陋的错误。较新的版本显示了更容易理解的错误。
| 归档时间: |
|
| 查看次数: |
10524 次 |
| 最近记录: |