如何在myBatis 3.1.1中基于枚举常量参数进行动态SQL?
发布于 2012-10-17 19:58:34
如何基于枚举常量执行动态
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> 笔记
发布于 2014-03-18 20:21:02
MyBatis允许对if (或when)语句中的字符串使用==而不是equals。所以下面的代码也可以(引号无关紧要):
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() == 'A'">65</when>
<when test="t.name() == 'B'">66</when>
<otherwise>0</otherwise>
</choose>
</select>发布于 2017-07-27 21:59:21
除了Tomer的答案之外,您还可以使用OGNL表示法来比较枚举值。
(直接比较枚举值具有编译时的优点,即,如果更改枚举成员,查询将很快失败。)
如果测试枚举作为公共类Test.java存在于full.package.name中,那么在mapper.xml中,您将拥有:
<when test='t == @full.package.name.Test@A'>如果测试枚举位于另一个类中,则如下所示:
package full.package.name;
public class ExampleClass {
public enum Test {
A, B
}
}然后,在mapper.xml中,您将拥有:
<when test='t == @full.package.name.ExampleClass$Test@A'>$符号在OGNL规范中没有文档记录,我发现它是in the MyBatis issues page
PS:如果OGNL字符串不正确(例如,NullPointerException),旧版本的MyBatis (例如,3.2.3)会显示丑陋的错误。较新的版本显示了一个更容易理解的错误。
https://stackoverflow.com/questions/12933813
复制相似问题