Reputation: 630
How to do dynamic SQL in myBatis 3.1.1 based on an enum constant parameter?
Upvotes: 16
Views: 19984
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
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() == "A"'>65</when>
<when test='t.name() == "A"'>66</when>**
<otherwise>0</otherwise>
</choose>
</select>
is another solution.
Upvotes: -1
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
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
Upvotes: 18