2016-07-06 51 views
0

我試圖在由IN子句組成的SELECT QUERY中傳遞多個值。我想執行以下查詢使用的MyBatis:使用mybatis註釋在IN子句中傳遞多個值

SELECT * FROM DBA_COMPARISON_ROW_DIF WHERE SCAN_ID in (#{childScanIDs}) 

其中childScanIDs變量由多個逗號分隔值的。我將這些值作爲由所有用逗號分隔的值組成的字符串傳遞。以下是在映射器界面中使用的方法。

@Select(getDifferencesByScanIDs) 
    @Results({ 
      @Result(property="owner", column="OWNER"), 
      @Result(property="comparisonName", column="COMPARISON_NAME"), 
      @Result(property="scanID", column="SCAN_ID"), 
      @Result(property="localRowID", column="LOCAL_ROWID"), 
      @Result(property="remoteRowID", column="REMOTE_ROWID"), 
      @Result(property="indexValue", column="INDEX_VALUE"), 
      @Result(property="status", column="STATUS"), 
      @Result(property="lastUpdateTime", column="LAST_UPDATE_TIME") 
    }) 
    List<Difference> getDifferencesByScanIDs(@Param("childScanIDs") String childScanIDs); 

我構建值的字符串是這樣的:

String scanIDs = StringUtils.join(cmp.getChildScanIDs(), ","); 

當執行功能,它提出這個例外。

### Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-01722: invalid number 

### The error may involve com.rs2.automation.soacomparison.dao.differences.DifferencesMapper.getDifferencesByScanIDs-Inline 
### The error occurred while setting parameters 
### Cause: java.sql.SQLSyntaxErrorException: ORA-01722: invalid number 

任何幫助,將不勝感激。我認爲問題在於mybatis沒有將這些值視爲單獨的數字。另一種解決方案是對每個數字執行查詢,但我想一次傳遞所有值。 在此先感謝。

回答

2
SELECT * FROM DBA_COMPARISON_ROW_DIF WHERE SCAN_ID in (#{childScanIDs}) 

如果我們想像這樣2, 13, 15, 16列表,這個查詢將導致:

SELECT * FROM DBA_COMPARISON_ROW_DIF WHERE SCAN_ID in ('2,13,15,16') 

正如你所看到的,值被視爲String而不是名單,這是不是你所需要的。

我會將cmp.getChildScanIDs()傳遞給mybatis,而不會將其轉換爲字符串,並使用mybatis的動態sql。

List<Difference> getDifferencesByScanIDs(@Param("childScanIDs") List<Integer> childScanIDs); // or int[] 

編輯查詢爲:

SELECT * FROM DBA_COMPARISON_ROW_DIF WHERE SCAN_ID in 
    <foreach item="item" index="index" collection="childScanIDs" open="(" separator="," close=")"> 
    #{item} 
    </foreach> 

做些什麼:

  • <的foreach>:

    編輯的方法開始foreach循環

  • 項目:循環內的當前對象的名稱
  • 指數:該指數變量(不是真的需要在這種情況下)
  • 集合:集合的名稱(按你的映射器接口定義)
  • 開放:字符串到第一次迭代之前
  • 靠近插入:串最後的迭代後插入
  • 分離器:字符串的元素和另一
  • 之間插入
  • # {項}:打印當前項

鏈接以供參考:MyBatis Dynamic SQL

+0

謝謝。我試過這個解決方案,但它給了我錯誤:###錯誤查詢數據庫。原因:org.apache.ibatis.type.TypeException:設置null參數時出錯。大多數JDBC驅動程序要求必須爲所有可空參數指定JdbcType。原因:java.sql.SQLException:列類型無效:1111 – gla315

+0

@ gla315嘗試告訴mybatis哪個類型的項目是:用##項目中的#{item,jdbcType = INTEGER}替換'#{item}' – BackSlash

+0

試過了,但它給我無效的SQL語句。這是查詢:@Select({ 「「}) – gla315

1

這不是在文檔上很清楚。有幾種方法可以做到這一點,但一個簡單的方法就是使用OGNL。我們通過OGNL評估#{xx}${xx}(文檔中解釋的差異)的任何參數。

所以你可以例如創建

public class InList { 
    public static String build(final List<?> params) { 
     return Joiner.on(",").join(params); 
    } 
} 

而且用它在你的查詢作爲

WHERE SCAN_ID IN (${@[email protected](childScanIds)}) 

注意:使用${}開闢了無意或有意的SQL注入的問題,但是,很明顯,這也是取決於你的用例,所以要謹慎使用它。

相關問題