13

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

4

4 回答 4

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>   

笔记

  • 测试表达式必须使用双引号而不是单引号引用字符串。
  • 您不能比较常量,只能比较字符串。
于 2012-10-17T11:58:33.623 回答
7

MyBatis 允许在(或)语句中==代替equalsfor 字符串。所以以下也可以工作(引号无关紧要):ifwhen

public enum Test {
    A, B;
}

映射器.java:

int test(@Param("t") Test t);

映射器.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>
于 2014-03-18T12:21:01.980 回答
6

除了 Tomer 的回答(效果很好)之外,您还可以使用OGNL表示法比较枚举值。

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

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

<when test='t == @full.package.name.Test@A'>

如果 Test 枚举在另一个类中,如下所示:

package full.package.name;

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

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

<when test='t == @full.package.name.ExampleClass$Test@A'>

$ 符号在 OGNL 规范中没有记录,我 在 MyBatis 问题页面中找到了它

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

于 2017-07-27T13:59:21.390 回答
-1
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() == &quot;A&quot;'>65</when>
            <when test='t.name() == &quot;A&quot;'>66</when>**
            <otherwise>0</otherwise>
        </choose>
    </select>   

is another solution.
于 2014-08-09T02:55:53.110 回答