in grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateQuery.java [155:228]
public void add(Criterion criterion) {
if (criterion instanceof FunctionCallingCriterion) {
org.hibernate.criterion.Criterion sqlRestriction = getRestrictionForFunctionCall((FunctionCallingCriterion) criterion, getEntity());
if (sqlRestriction != null) {
addToCriteria(sqlRestriction);
}
}
else if (criterion instanceof PropertyCriterion) {
PropertyCriterion pc = (PropertyCriterion) criterion;
Object value = pc.getValue();
if (value instanceof QueryableCriteria) {
setDetachedCriteriaValue((QueryableCriteria) value, pc);
} else {
if (!(value instanceof DetachedCriteria)) {
doTypeConversionIfNeccessary(getEntity(), pc);
}
}
}
if (criterion instanceof DetachedAssociationCriteria) {
DetachedAssociationCriteria associationCriteria = (DetachedAssociationCriteria) criterion;
Association association = associationCriteria.getAssociation();
List<Query.Criterion> criteria = associationCriteria.getCriteria();
if(association instanceof Embedded) {
String associationName = association.getName();
if (getCurrentAlias() != null) {
associationName = getCurrentAlias() + '.' + associationName;
}
for (Criterion c : criteria) {
final org.hibernate.criterion.Criterion hibernateCriterion = getHibernateCriterionAdapter().toHibernateCriterion(this, c, associationName);
if (hibernateCriterion != null) {
addToCriteria(hibernateCriterion);
}
}
}
else {
CriteriaAndAlias criteriaAndAlias = getCriteriaAndAlias(associationCriteria);
if(criteriaAndAlias.criteria != null) {
aliasInstanceStack.add(criteriaAndAlias.criteria);
}
else if(criteriaAndAlias.detachedCriteria != null) {
aliasInstanceStack.add(criteriaAndAlias.detachedCriteria);
}
aliasStack.add(criteriaAndAlias.alias);
associationStack.add(association);
entityStack.add(association.getAssociatedEntity());
try {
@SuppressWarnings("unchecked")
List<Criterion> associationCriteriaList = criteria;
for (Criterion c : associationCriteriaList) {
add(c);
}
}
finally {
aliasInstanceStack.removeLast();
aliasStack.removeLast();
entityStack.removeLast();
associationStack.removeLast();
}
}
}
else {
final org.hibernate.criterion.Criterion hibernateCriterion = getHibernateCriterionAdapter().toHibernateCriterion(this, criterion, getCurrentAlias());
if (hibernateCriterion != null) {
addToCriteria(hibernateCriterion);
}
}
}