6

我正在使用 MyBatis 映射一些需要比较String参数 ( myString) 的查询。

我的映射器界面是:

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

4

4 回答 4

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>

注意 test 周围的单引号和 de 常量值周围的双引号。如您所见,诀窍是使用equals。

于 2015-11-17T12:46:14.107 回答
3

当然,我必须通过一个复杂的方法。

更改映射器方法签名:

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。

于 2013-10-21T16:44:59.520 回答
1

假设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;

于 2013-10-21T05:45:46.663 回答
1

应该提到另一种解决方案:

<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>
于 2017-03-14T13:31:33.260 回答