Tomer
Tomer

Reputation: 630

Using enum parameters in myBatis dynamic SQL

How to do dynamic SQL in myBatis 3.1.1 based on an enum constant parameter?

Upvotes: 16

Views: 19984

Answers (4)

Vlad Dinulescu
Vlad Dinulescu

Reputation: 1221

Besides Tomer's answer, which works just fine, you can also compare enum values by using the OGNL notation.

(Comparing enum values directly has compile-time advantages, ie, if you change the enum members, the query will fail fast.)

If the Test enum lives in full.package.name as a public class, Test.java, then, in mapper.xml, you'd have:

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

If the Test enum is inside another class, like this:

package full.package.name;

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

Then, in mapper.xml you'd have:

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

The $ sign is undocumented in the OGNL specification, I've found it in the MyBatis issues page

PS: Older versions of MyBatis (for instance, 3.2.3) show ugly errors if the OGNL string is not correct (like, NullPointerException). Newer versions show a more understandable error.

Upvotes: 8

Bharath
Bharath

Reputation: 1807

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.

Upvotes: -1

Nailgun
Nailgun

Reputation: 4169

MyBatis allows == instead of equals for strings in if (or when) statements. So the following would also work (quotes don't matter):

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>

Upvotes: 10

Tomer
Tomer

Reputation: 630

How to do dynamic SQL based on enum constants

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>   

Notes

  • The test expression must refer to strings using double quotes, not single quotes.
  • You can't compare constants, only strings.

Upvotes: 18

Related Questions