Caused by: java.sql.SQLSyntaxErrorException: ORA-01795: 列表中的最大表达式数为 1000

今天又遇见一个基础的问题,但是自己从来没有注意过的问题(打脸)。

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();
		
	}

总结,还是要注意基础及技术使用限制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值