我正在使用MyBatis映射一些我需要比较String
参数(myString
)的查询。
我的Mapper 界面是:
public Map<Integer, String> findSomething(@Param("myString") String myString);
我的 XML 如下:
<select id="findSomething" parameterType="String" resultType="Map">
SELECT column1 as key,
column2 as value
FROM my_table
<where>
<choose>
<when test="myString == 'xxx'">
column3 = 1
</when>
<when test="myString == 'yyy'">
myColumn = 2
</when>
<when test="myString == 'zzz'">
myColumn = 3
</when>
</choose>
</where>
ORDER BY value;
</select>
当我执行此语句时,抛出以下错误:
ERROR [stderr] Caused by: org.apache.ibatis.exceptions.PersistenceException:
ERROR [stderr] ### Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'myString' in 'class java.lang.String'
这样做String
比较,闻起来很糟糕。不幸的是,这是数据库建模的方式。
MyBatis版本:3.2.2
答案 0 :(得分:6)
使用MyBatis 3.2.8进行测试
<select id="findSomething" parameterType="String" resultType="Map">
SELECT column1 as key,
column2 as value
FROM my_table
<where>
<choose>
<when test='"xxx".equals(myString)'>
column3 = 1
</when>
<when test='"yyy".equals(myString)'>
myColumn = 2
</when>
<when test='"zzz".equals(myString)'>
myColumn = 3
</when>
</choose>
</where>
ORDER BY value;
</select>
请注意测试周围的单引号和de常量值周围的双引号。诀窍是使用你可以看到的等号。
答案 1 :(得分:2)
当然,我必须经历一个复杂的方法。
更改了映射器方法签名:
public Map<Integer, String> findSomething(@Param("myPojo") MyPojo myPojo);
XML 必须是:
<select id="findSomething" resultType="Map">
SELECT column1 as key,
column2 as value
FROM my_table
<where>
<choose>
<when test="myPojo == 'xxx'">
column3 = 1
</when>
<when test="myPojo == 'yyy'">
myColumn = 2
</when>
<when test="myPojo == 'zzz'">
myColumn = 3
</when>
</choose>
</where>
ORDER BY value;
请不要忘记,作为一个POJO,参数类必须拥有它各自的getter和setter。
答案 2 :(得分:0)
假设Mybatis 3.2.2及更高版本,请将您的xml修改为以下内容并查看它是否有帮助:
<select id="findSomething" parameterType="String" resultType="Map">
SELECT column1 as key,
column2 as value
FROM my_table
<where>
<choose>
<when test="value == 'xxx'">
column3 = 1;
</when>
<when test="value == 'yyy'">
myColumn = 2;
</when>
<when test="value == 'zzz'">
myColumn = 3;
</when>
</choose>
</where>
ORDER BY value;
答案 3 :(得分:0)
应该提到另一个解决方案:
[...]
000000000040052d <main>:
40052d: 55 push %rbp
40052e: 48 89 e5 mov %rsp,%rbp
400531: bf c4 05 40 00 mov $0x4005c4,%edi
400536: e8 d5 fe ff ff callq 400410 <puts@plt>
40053b: 5d pop %rbp
40053c: c3 retq
40053d: 0f 1f 00 nopl (%rax)
[...]