protected Map<Subcriteria, Order> getSortSubcriteriaFromCriteria(Criteria executable){ List<Subcriteria> subcriteriaList = getCriteriaSubcriteria(executable); List<Order> orderings = getOrderingFromCriteria(executable); Map<Subcriteria, Order> aliasToOrderMap = new HashMap<Subcriteria, Order>(); for(Order order : orderings){ for(Subcriteria subcriteria : subcriteriaList){ if(order.toString().startsWith(subcriteria.getAlias()+ ".")){ aliasToOrderMap.put(subcriteria, order); } } } return aliasToOrderMap; } protected List<Subcriteria> getCriteriaSubcriteria(Criteria executable){
private String getWholeAssociationPath(CriteriaImpl.Subcriteria subcriteria) { String path = subcriteria.getPath(); // some messy, complex stuff here, since createCriteria() can take an // aliased path, or a path rooted at the creating criteria instance Criteria parent = null; if ( path.indexOf('.')>0 ) { //if it is a compound path String testAlias = StringHelper.root(path); if ( !testAlias.equals( subcriteria.getAlias() ) ) { //and the qualifier is not the alias of this criteria parent = (Criteria) aliasCriteriaMap.get(testAlias); //check to see if we belong to some criteria other than the one that created us } } if (parent==null) { parent = subcriteria.getParent(); //otherwise assume the parent is the the criteria that created us } else { path = StringHelper.unroot(path); } if ( parent.equals(rootCriteria) ) { //if its the root criteria, we are done return path; } else { return getWholeAssociationPath( (CriteriaImpl.Subcriteria) parent ) + '.' + path; //otherwise, recurse } }
if ( !testAlias.equals( subcriteria.getAlias() ) ) {
public Object doInHibernate(Session session) throws HibernateException, SQLException { CriteriaImpl impl = (CriteriaImpl) criteria; Criteria totalCriteria = session.createCriteria(impl.getEntityOrClassName()); hibernateTemplate.applySettings(totalCriteria); Iterator iterator = impl.iterateExpressionEntries(); while (iterator.hasNext()) { CriteriaImpl.CriterionEntry entry = (CriteriaImpl.CriterionEntry) iterator.next(); totalCriteria.add(entry.getCriterion()); } Iterator subcriteriaIterator = impl.iterateSubcriteria(); while (subcriteriaIterator.hasNext()) { CriteriaImpl.Subcriteria sub = (CriteriaImpl.Subcriteria) subcriteriaIterator.next(); totalCriteria.createAlias(sub.getPath(), sub.getAlias(), sub.getJoinType(), sub.getWithClause()); } totalCriteria.setProjection(impl.getProjection()); totalCriteria.setProjection(Projections.rowCount()); return ((Number)totalCriteria.uniqueResult()).intValue(); } });
protected void copyOrdersAndTheirSubcriteriaFromCriteriaToAnother(Criteria executable, DetachedCriteria criteria){ Map<Subcriteria, Order> aliasToOrderMap = getSortSubcriteriaFromCriteria(executable); for(Subcriteria subcriteria : aliasToOrderMap.keySet()){ criteria.createAlias(subcriteria.getPath(), subcriteria.getAlias(), subcriteria.getJoinType()); } for(Order order : aliasToOrderMap.values()){ criteria.addOrder(order); } }