protected void applySubCriteriaToJunction(
      PersistentEntity entity,
      AbstractHibernateQuery hibernateCriteria,
      List<Query.Criterion> existing,
      Junction conjunction,
      String alias) {

    for (Query.Criterion subCriterion : existing) {
      if (subCriterion instanceof Query.PropertyCriterion) {
        Query.PropertyCriterion pc = (Query.PropertyCriterion) subCriterion;
        if (pc.getValue() instanceof QueryableCriteria) {
          pc.setValue(getHibernateDetachedCriteria((QueryableCriteria<?>) pc.getValue()));
        } else {
          AbstractHibernateQuery.doTypeConversionIfNeccessary(entity, pc);
        }
      }
      CriterionAdaptor criterionAdaptor = criterionAdaptors.get(subCriterion.getClass());
      if (criterionAdaptor != null) {
        Criterion c = criterionAdaptor.toHibernateCriterion(hibernateCriteria, subCriterion, alias);
        if (c != null) conjunction.add(c);
      } else if (subCriterion instanceof FunctionCallingCriterion) {
        Criterion sqlRestriction =
            hibernateCriteria.getRestrictionForFunctionCall(
                (FunctionCallingCriterion) subCriterion, entity);
        if (sqlRestriction != null) {
          conjunction.add(sqlRestriction);
        }
      }
    }
  }
 public org.hibernate.criterion.Criterion toHibernateCriterion(HibernateQuery hibernateQuery) {
   final CriterionAdaptor criterionAdaptor = criterionAdaptors.get(criterion.getClass());
   if (criterionAdaptor != null) {
     return criterionAdaptor.toHibernateCriterion(hibernateQuery, criterion, alias);
   }
   return null;
 }