ps : mybatis在in中參數過多
出現問題
com.microsoft.sqlserver.jdbc.SQLServerException: 傳入的請求具有過多的參數。該服務器支持最多 2100 個參數
原因
- SqlServer 對語句的條數和參數的數量都有限制,分別是 1000 和 2100。
- Mysql 對語句的長度有限制,默認是 4M。
- Mybatis 對動態語句沒有數量上的限制
https://blog.csdn.net/wangfei964279744/article/details/78352055#commentsedit
### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 傳入的請求具有過多的參數。該服務器支持最多 2100 個參數。請減少參數的數目,然后重新發送該請求。
### The error occurred while setting parameters
### SQL:
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 傳入的請求具有過多的參數。該服務器支持最多 2100 個參數。請減少參數的數目,然后重新發送該請求。
; uncategorized SQLException for SQL []; SQL state [S0001]; error code [8003]; 傳入的請求具有過多的參數。該服務器支持最多 2100 個參數。請減少參數的數目,然后重新發送該請求。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 傳入的請求具有過多的參數。該服務器支持最多 2100 個參數。請減少參數的數目,然后重新發送該請求。
解決方案
SQLserver對可以設置的參數有限制。
我們可以采用自己拼接 SQL 語句的方式來實現 in 的操作
我在 java 代碼中進行如下操作:
String list = parkingIdss.toString();
String list1 = list.substring(1, list.length() - 1);
List<ParkingVo> parking = null;
if ("".equals(list1)) {
parking = parkMapper.selectParkingInfoByPrimaryKeyList(null);
} else {
parking = parkMapper.selectParkingInfoByPrimaryKeyList("(" + list1 + ")");
}
SQL 語句中如下操作:
<where>
<if test="list != null">
and p.Id in ${list}
</if>
</where>