今天又遇见一个基础的问题,但是自己从来没有注意过的问题(打脸)。
Caused by: java.sql.SQLSyntaxErrorException: ORA-01795: 列表中的最大表达式数为 1000
就这个错误,这个错误出现的原因就是在sql中in的参数数量不能超过1000条。很基础简单的问题,但是平常没有注意,只觉得写sql的时候直接赋值很开心,根本没考虑限制。接下来就是具体出现问题及我的解决方案。
public void delUAndRById( String[] uIds) {
List<String> uList = new ArrayList<String>();
for(String uId : uIds){
uList.add(uId);
}
Query query= HibernateUtil.currentSessionWithTransaction().createQuery("delete from ..... where .......ur.uId in (:uList)").setCacheable(false);//问题就出在这里 in 但是我的参数传过来超过1000条
-----------------------别的代码都省略了哈 只留重要的-----------------------------------
}
解决方案,既然in只能承受一千次暴击,那么我们就让他循环承受平A。
public void delUserAndRoleListById(String[] userIds) {
String sql = "delete from ....... ur where ur.uId ";
for (int i = 0; i < uIds.length; i++) {
if (i == 0) {
sql+="in (";
}
sql+="'";
sql+=uIds[i].toString();
sql+="'";
if (i >= 900 && i < uIds.length - 1) {
if (i % 900 == 0) {
sql+=") or ";
sql+=" ur.uId in (";
} else {
sql+=",";
}
} else {
if (i < uIds.length - 1) {
sql+=",";
}
}
if (i == uIds.length - 1) {
sql+=")";
}
}
Query query= HibernateUtil.currentSessionWithTransaction().createQuery(sql);
query.executeUpdate();
}
总结,还是要注意基础及技术使用限制。