2016-03-09 191 views
1

我想这个查询写入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,r esultMapId ='null',jdbcTypeName ='null',表达式='null'}。原因:org.apache.ibatis.type.TypeException:使用JdbcType VARCHAR为参数#1设置非空值时出错。尝试为此参数或其他配置属性设置不同的JdbcType。原因:java.sql.SQLException:参数索引超出范围(1>参数数量,即0)。

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

+0

你可以通过两个参数与不同的名字和检查? 'hasName(@Param(“name”)字符串名称,@Param(“otherName”)字符串otherName);'我想问题是mybatis期待两个参数,但你传递一个。 – Lucky

+0

@Lucky我得到了同样的错误..我认为有什么问题的“ – feco

+0

你也可以在你的问题中发布这个查询的mysql等价物,并尝试这个工作在你的mysql工作台吗? – Lucky

回答

2

我决定从

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})其中函数/进程内将 处理它。如果你在多个SqlMaps中使用这个,那么我可能会沿着这条路走 。

+1

我刚刚在这个查询中工作,并从你链接到的帖子,我也不得不在mysql中使用LIKE条件,并遵循第一种方法, ''%'|| $ {param} ||'%''但它应该是''%'||#{param} ||'%''使查询工作。查询中的$符号使mybatis认为我正在从String类中取出,并且在类String中找不到param的setter。再次欢呼为答案。 ;) – Lucky

1

不完全是你的情况,但如果你已经注释掉在您的查询的线路,而像包含的参数,比如你可以得到同样的错误消息:

-- AND (neId=#{neId})) 
+0

这是我的问题。在我的MyBatis XML映射器文件中,我使用标准的XML'/ * * /'注释块在''块中注释了一部分查询。删除评论解决了我的问题。谢谢@golimar –