in grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/query/GrailsHibernateQueryUtils.java [132:182]
public static void populateArgumentsForCriteria(
PersistentEntity entity,
CriteriaQuery query,
Root queryRoot,
CriteriaBuilder criteriaBuilder,
Map argMap,
ConversionService conversionService,
boolean useDefaultMapping) {
String orderParam = (String) argMap.get(DynamicFinder.ARGUMENT_ORDER);
Object fetchObj = argMap.get(DynamicFinder.ARGUMENT_FETCH);
if (fetchObj instanceof Map) {
Map fetch = (Map) fetchObj;
for (Object o : fetch.keySet()) {
String associationName = (String) o;
final FetchMode fetchMode = getFetchMode(fetch.get(associationName));
if (fetchMode == FetchMode.JOIN) {
queryRoot.join(associationName);
}
}
}
final Object sortObj = argMap.get(DynamicFinder.ARGUMENT_SORT);
if (sortObj != null) {
boolean ignoreCase = true;
Object caseArg = argMap.get(DynamicFinder.ARGUMENT_IGNORE_CASE);
if (caseArg instanceof Boolean) {
ignoreCase = (Boolean) caseArg;
}
if (sortObj instanceof Map) {
Map sortMap = (Map) sortObj;
for (Object sort : sortMap.keySet()) {
final String order = DynamicFinder.ORDER_DESC.equalsIgnoreCase((String) sortMap.get(sort)) ? DynamicFinder.ORDER_DESC : DynamicFinder.ORDER_ASC;
addOrderPossiblyNested(query,queryRoot, criteriaBuilder, entity, (String) sort, order, ignoreCase);
}
} else {
final String sort = (String) sortObj;
final String order = DynamicFinder.ORDER_DESC.equalsIgnoreCase(orderParam) ? DynamicFinder.ORDER_DESC : DynamicFinder.ORDER_ASC;
addOrderPossiblyNested(query, queryRoot, criteriaBuilder,entity, sort, order, ignoreCase);
}
} else if (useDefaultMapping) {
Mapping m = AbstractGrailsDomainBinder.getMapping(entity.getJavaClass());
if (m != null) {
Map sortMap = m.getSort().getNamesAndDirections();
for (Object sort : sortMap.keySet()) {
final String order = DynamicFinder.ORDER_DESC.equalsIgnoreCase((String) sortMap.get(sort)) ? DynamicFinder.ORDER_DESC : DynamicFinder.ORDER_ASC;
addOrderPossiblyNested(query,queryRoot, criteriaBuilder, entity, (String) sort, order, true);
}
}
}
}