public String generateQL(Class<?> entityClass, ISearch search, List<Object> paramList) {
if (entityClass == null)
throw new NullPointerException("The entity class for a search cannot be null");
SearchContext ctx = new SearchContext(entityClass, rootAlias, paramList);
List<Field> fields = checkAndCleanFields(search.getFields());
applyFetches(ctx, checkAndCleanFetches(search.getFetches()), fields);
String select = generateSelectClause(ctx, fields, search.isDistinct());
String where = generateWhereClause(ctx, checkAndCleanFilters(search.getFilters()), search.isDisjunction());
String orderBy = generateOrderByClause(ctx, checkAndCleanSorts(search.getSorts()));
String from = generateFromClause(ctx, true);
StringBuilder sb = new StringBuilder();
sb.append(select);
sb.append(from);
sb.append(where);
sb.append(orderBy);
String query = sb.toString();
if (logger.isDebugEnabled())
logger.debug("generateQL:\n " + query);
return query;
}