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;
}
}
当离线查询中in(not in)里的个数超过1000时
最新推荐文章于 2024-07-13 01:57:56 发布