MyBatis:使用动态查询比较String值

时间:2013-10-18 12:59:37

标签: java database mybatis

我正在使用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

4 个答案:

答案 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)

[...]