2016-03-09 185 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 –