public QueryParameters getQueryParameters() { LockOptions lockOptions = new LockOptions(); RowSelection selection = new RowSelection(); selection.setFirstRow(rootCriteria.getFirstResult()); selection.setMaxRows(rootCriteria.getMaxResults()); selection.setTimeout(rootCriteria.getTimeout()); selection.setFetchSize(rootCriteria.getFetchSize()); Iterator iter = rootCriteria.getLockModes().entrySet().iterator(); while (iter.hasNext()) { Map.Entry me = (Map.Entry) iter.next(); final Criteria subcriteria = getAliasedCriteria((String) me.getKey()); lockOptions.setAliasSpecificLockMode(getSQLAlias(subcriteria), (LockMode) me.getValue()); } List values = new ArrayList(); List types = new ArrayList(); iter = rootCriteria.iterateSubcriteria(); while (iter.hasNext()) { CriteriaImpl.Subcriteria subcriteria = (CriteriaImpl.Subcriteria) iter.next(); LockMode lm = subcriteria.getLockMode(); if (lm != null) { lockOptions.setAliasSpecificLockMode(getSQLAlias(subcriteria), lm); } if (subcriteria.getWithClause() != null) { TypedValue[] tv = subcriteria.getWithClause().getTypedValues(subcriteria, this); for (int i = 0; i < tv.length; i++) { values.add(tv[i].getValue()); types.add(tv[i].getType()); } } } // Type and value gathering for the WHERE clause needs to come AFTER lock mode gathering, // because the lock mode gathering loop now contains join clauses which can contain // parameter bindings (as in the HQL WITH clause). iter = rootCriteria.iterateExpressionEntries(); while (iter.hasNext()) { CriteriaImpl.CriterionEntry ce = (CriteriaImpl.CriterionEntry) iter.next(); TypedValue[] tv = ce.getCriterion().getTypedValues(ce.getCriteria(), this); for (int i = 0; i < tv.length; i++) { values.add(tv[i].getValue()); types.add(tv[i].getType()); } } Object[] valueArray = values.toArray(); Type[] typeArray = ArrayHelper.toTypeArray(types); return new QueryParameters( typeArray, valueArray, lockOptions, selection, rootCriteria.isReadOnlyInitialized(), (rootCriteria.isReadOnlyInitialized() ? rootCriteria.isReadOnly() : false), rootCriteria.getCacheable(), rootCriteria.getCacheRegion(), rootCriteria.getComment(), rootCriteria.isLookupByNaturalKey(), rootCriteria.getResultTransformer()); }
@SuppressWarnings({"unchecked", "rawtypes"}) protected int countCriteriaResult(final Criteria c) { CriteriaImpl impl = (CriteriaImpl) c; Projection projection = impl.getProjection(); ResultTransformer transformer = impl.getResultTransformer(); List<CriteriaImpl.OrderEntry> orderEntries = null; try { orderEntries = (List<CriteriaImpl.OrderEntry>) ReflectionUtils.getFieldValue(impl, "orderEntries"); ReflectionUtils.setFieldValue(impl, "orderEntries", new ArrayList()); } catch (Exception e) { logger.error("", e); } int totalCount = (Integer) c.setProjection(Projections.rowCount()).uniqueResult(); c.setProjection(projection); if (projection == null) { c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); } if (transformer != null) { c.setResultTransformer(transformer); } try { ReflectionUtils.setFieldValue(impl, "orderEntries", orderEntries); } catch (Exception e) { logger.error("", e); } return totalCount; }
protected long countCriteriaResult(Criteria c) { CriteriaImpl impl = (CriteriaImpl) c; Projection projection = impl.getProjection(); ResultTransformer transformer = impl.getResultTransformer(); List orderEntries = null; try { orderEntries = (List) ReflectionUtils.getFieldValue(impl, "orderEntries"); ReflectionUtils.setFieldValue(impl, "orderEntries", new ArrayList()); } catch (Exception e) { this.logger.error("不可能抛出的异常:{}", e.getMessage()); } Long totalCountObject = Long.valueOf(0L); Object object = c.setProjection(Projections.rowCount()).uniqueResult(); if (object instanceof Long) totalCountObject = (Long) object; else if (object instanceof Integer) { totalCountObject = Long.valueOf(((Integer) object).intValue()); } long totalCount = (totalCountObject != null) ? totalCountObject.longValue() : 0L; c.setProjection(projection); if (projection == null) { c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); } if (transformer != null) c.setResultTransformer(transformer); try { ReflectionUtils.setFieldValue(impl, "orderEntries", orderEntries); } catch (Exception e) { this.logger.error("不可能抛出的异常:{}", e.getMessage()); } return totalCount; }
/** * 通过count查询获得本次查询所能获得的对象总数. * * @return page对象中的totalCount属性将赋值. */ protected int countQueryResult(Page<T> page, Criteria c) { CriteriaImpl impl = (CriteriaImpl) c; // 先把Projection、ResultTransformer、OrderBy取出来,清空三者后再执行Count操作 Projection projection = impl.getProjection(); ResultTransformer transformer = impl.getResultTransformer(); List<CriteriaImpl.OrderEntry> orderEntries = null; try { orderEntries = (List) BeanUtils.getFieldValue(impl, "orderEntries"); BeanUtils.setFieldValue(impl, "orderEntries", new ArrayList()); } catch (Exception e) { log.error("不可能抛出的异常", e); } // 执行Count查询 int totalCount = (Integer) c.setProjection(Projections.rowCount()).uniqueResult(); if (totalCount < 1) return -1; // 将之前的Projection和OrderBy条件重新设回去 c.setProjection(projection); if (projection == null) { c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); } if (transformer != null) { c.setResultTransformer(transformer); } try { BeanUtils.setFieldValue(impl, "orderEntries", orderEntries); } catch (Exception e) { log.error("不可能抛出的异常", e); } return totalCount; }