MyBatis参数索引超出范围

时间:2016-03-09 06:56:00

标签: java mysql mybatis

我正在尝试将此查询写入MyBatis

    (select * from table1 where field1 like '%"name":"appname"%' limit 1)
    union all
    (select * from table2 where field1 like '%"name":"appname"%' limit 1)
    limit 1

所以我创建了这个注释:

@Select({
    "(select * from table1 where field1 like '%\"name\":\"#{name,jdbcType=VARCHAR}\"%' limit 1)",
    "union all",
    "(select * from table2 where field1 like '%\"name\":\"#{name,jdbcType=VARCHAR}\"%' limit 1)",
    "limit 1"
})
@Results({
    @Result(column="ID", property="id", jdbcType=JdbcType.INTEGER, id=true)
})
Object hasName(@Param("name")String name);

但是当我运行它时,我得到了这个例外:

  

无法设置映射参数:ParameterMapping {property ='name',mode = IN,javaType = class java.lang.String,jdbcType = VARCHAR,numericScale = null,resultMapId ='null',jdbcTypeName ='null' ,expression ='null'}。原因:org.apache.ibatis.type.TypeException:使用JdbcType VARCHAR为参数#1设置非null时出错。尝试为此参数或其他配置属性设置不同的JdbcType。原因:java.sql.SQLException:参数索引超出范围(1>参数个数,为0)。

我可以像这样映射注释,还是我错过了什么?我不想为此使用XML。

3 个答案:

答案 0 :(得分:3)

我决定从

更改部分查询
field1 like '%\"name\":\"#{name,jdbcType=VARCHAR}\"%'

field1 like #{name,jdbcType=VARCHAR}

并在Java中更改参数名称

parameter = "%\"name\":\"" + parameter + "\"%";

我按照post我发现

的解释
  

'%'||${specific_string}||'%'

     

     

#{do_it_in_java}

     

     

someFunctionOrProc(#{specific_string})函数/ proc将在哪里   处理它。如果你在多个SqlMaps中使用它很多,那么我可能会去   走这条路。

答案 1 :(得分:1)

不完全是您的情况,但如果您在查询中注释了一行,并且包含参数,例如:

,则可以获得相同的错误消息
-- AND (neId=#{neId})) 

答案 2 :(得分:0)

尝试一下:

field1 like ${name}
field2 like ${name}