首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在myBatis动态SQL中使用枚举参数

在myBatis动态SQL中使用枚举参数
EN

Stack Overflow用户
提问于 2012-10-17 19:58:34
回答 4查看 14.2K关注 0票数 13

如何在myBatis 3.1.1中基于枚举常量参数进行动态SQL?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-17 19:58:34

如何基于枚举常量执行动态

代码语言:javascript
复制
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>   

笔记

  • 测试表达式必须使用双引号引用字符串,而不能使用单引号。
  • 您不能比较常量,只能比较字符串。
票数 17
EN

Stack Overflow用户

发布于 2014-03-18 20:21:02

MyBatis允许对if (或when)语句中的字符串使用==而不是equals。所以下面的代码也可以(引号无关紧要):

代码语言:javascript
复制
public enum Test {
    A, B;
}

Mapper.java:

代码语言:javascript
复制
int test(@Param("t") Test t);

Mapper.xml:

代码语言:javascript
复制
<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>
票数 7
EN

Stack Overflow用户

发布于 2017-07-27 21:59:21

除了Tomer的答案之外,您还可以使用OGNL表示法来比较枚举值。

(直接比较枚举值具有编译时的优点,即,如果更改枚举成员,查询将很快失败。)

如果测试枚举作为公共类Test.java存在于full.package.name中,那么在mapper.xml中,您将拥有:

代码语言:javascript
复制
<when test='t == @full.package.name.Test@A'>

如果测试枚举位于另一个类中,则如下所示:

代码语言:javascript
复制
package full.package.name;

public class ExampleClass {
    public enum Test {
        A, B
    }
}

然后,在mapper.xml中,您将拥有:

代码语言:javascript
复制
<when test='t == @full.package.name.ExampleClass$Test@A'>

$符号在OGNL规范中没有文档记录,我发现它是in the MyBatis issues page

PS:如果OGNL字符串不正确(例如,NullPointerException),旧版本的MyBatis (例如,3.2.3)会显示丑陋的错误。较新的版本显示了一个更容易理解的错误。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12933813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档