public class DBUtils { /** * * 当离线查询中in(not in)里的个数超过1000时 ,拆分成几个不同的in分句中 * * * create by liutingfeng * * @param list * 满足条件的集合 * @param detachedCriteria * * DetachedCriteria对象 * @param inOrNot * in 或者 not * @param field * 字段名称 * @param * manageSizeEachOnce * 拆分每个in中放多少个,不填写默认是1000个 * @return DetachedCriteria * * * example: * * * final DetachedCriteria criteria = * * DetachedCriteria.forClass(Product.class); * * * final List scopeProductClasses = * this.productClassDao * .findSubClassesByMultiIds("1,2"); * * * DbHelper.splitSourceInDc(scopeProductClasses, criteria, "in", * * "class5"); */ @SuppressWarnings("unchecked") public static DetachedCriteria splitSourceInDc(List list, DetachedCriteria detachedCriteria, String inOrNot, String field, Integer... manageSizeEachOnce) { Integer size = 1000; // 如果指定了每次处理的数量,没有写默认为1000 if (ObjectHelper.isNotEmpty(manageSizeEachOnce) && ObjectHelper.isNotEmpty(manageSizeEachOnce[0])) { size = manageSizeEachOnce[0]; } if (ObjectHelper.isNotEmpty(list) && list.size() > 0) { Junction junction = null; if (("in").equals(inOrNot)) { junction = Restrictions.disjunction(); } else if ("not".equals(inOrNot)) { junction = Restrictions.conjunction(); } // 总共分成totalPage数个in (not in)语句 int totalPage = list.size() / size + (list.size() % size > 0 ? 1 : 0); for (int i = 0; i < totalPage; i++) { // 起始list的记录 int startIndexOfList = i * size; // 结束list的记录 int endIndexOfList = (i + 1) * size > list.size() ? list.size() : (i + 1) * size; List sublist = list.subList(startIndexOfList, endIndexOfList); junction.add(Restrictions.in(field, sublist)); } detachedCriteria.add(junction); } return detachedCriteria; } }