我正在尝试将此查询写入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。
答案 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}