2012-01-06 19 views
15

有一個在我的MyBatis包含IN子句這基本上是一個集ID的(整數)的如何整數數組傳遞給IN子句中的MyBatis

現在我堅持我如何能整數關口查詢數組添加到此IN子句中,以便它可以提取正確的記錄。通過將包含ID的字符串傳遞給IN子句來實現,但這不能按預期工作。下面

MyBatis的方法使用註釋

@Select(SEL_QUERY) 
    @Results(value = {@Result(property="id",column="ID")}) 
    List<Integer> getIds(@Param("usrIds") Integer[] usrIds); 

查詢

代碼示例

select distinct ID from table a where a.id in (#{usrIds}) 

方法調用

Integer[] arr = new Integer[2]; 
arr[0] = 1; 
arr[1] = 2; 

mapper.getIds(arr) 

這不是工作,MyBatis的拋出一個錯誤WH恩我調用映射器方法

任何建議請

回答

26

myBatis User Guide on Dynamic SQL對如何使用foreach循環來構建查詢字符串,它適用於列表和數組的例子。

在發佈3.2之前,您必須使用xml配置來使用動態sql,使用更新的版本,它也應該可以使用dynamic sql in annotations

<select id="selectPostIn" resultType="domain.blog.Post"> 
    SELECT * 
    FROM POST P 
    WHERE ID in 
    <foreach item="item" index="index" collection="list" 
      open="(" separator="," close=")"> 
     #{item} 
    </foreach> 
</select> 
+0

感謝您的提示,我會檢查出來並更新這裏的空間 – Vivek 2012-01-06 13:12:47

+1

實際上,只要您的查詢字符串以'

3

是的,你可以使用註釋來做到這一點。

如果您使用的是postgresql,您可以像in this post這樣做。

如果你使用MySQL的嘗試這改變你的代碼示例:

MyBatis的方法使用註釋

@Select(SEL_QUERY) 
    @Results(value = {@Result(property="id",column="ID")}) 
    List<Integer> getIds(@Param("usrIds") String usrIds); 

查詢(使用MySQL)

select distinct ID from table a where FIND_IN_SET(a.id, #{usrIds}) <> 0 

方法調用

Integer[] arr = new Integer[2]; 
arr[0] = 1; 
arr[1] = 2; 

String usrIds= ""; 
for (int id : ids) { 
    usrIds += id + ","; 
} 

mapper.getIds(usrIds) 
+0

正是我所需要的 – deeshank 2016-08-09 15:59:31

+1

這裏有一個值得注意的是FIND_IN_SET不會使用索引,所以這個版本可能比IN語句執行的更差 – Zack 2017-04-25 22:44:41

相關問題