2013-10-18 28 views
4

我使用MyBatis来映射某些查询,我需要比较String参数(myString)。MyBatis:使用动态查询比较字符串值

我映射接口是:

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' 

A String这样比较,味道不好。不幸的是,这是数据库建模的方式。

MyBatis的版本:3.2.2

回答

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,参数类必须有它的各自的获得者和制定者。

+0

太糟糕了,你去了“复杂的方法”,你的原始代码与事实并不相同:你所要做的就是从语句中删除'parameterType =“String”',然后参数类型变成隐式地映射,因为你命名带@Param(“myString”)的参数。 – blackwizard

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; 

+0

其实我需要比较的方法来接收参数,通过查询指定不是列。检查问题中的方法签名。 – axcdnt

4

测试用的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> 

注意周围的测试单引号和双引号来德的恒定值。诀窍是使用equals,如你所见。

+0

MyBatis允许使用'=='语法进行字符串比较。 –

0

还有一个解决办法应该提到:

<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>