public <T> List<T> findByNamedQuery(SearchParameters sp) {
    if (sp == null || !sp.hasNamedQuery()) {
      throw new IllegalArgumentException(
          "searchParameters must be non null and must have a namedQuery");
    }

    Query query = entityManager.createNamedQuery(sp.getNamedQuery());
    String queryString = getQueryString(query);

    // append order by if needed
    if (queryString != null && sp.hasOrders()) {
      // create the sql restriction clausis
      StringBuilder orderClausis = new StringBuilder("order by ");
      boolean first = true;
      for (OrderBy orderBy : sp.getOrders()) {
        if (!first) {
          orderClausis.append(", ");
        }
        orderClausis.append(orderBy.getColumn());
        orderClausis.append(orderBy.isOrderDesc() ? " desc" : " asc");
        first = false;
      }

      if (log.isDebugEnabled()) {
        log.debug("appending: [" + orderClausis.toString() + "] to " + queryString);
      }

      query = recreateQuery(query, queryString + " " + orderClausis.toString());
    }

    // pagination
    if (sp.getFirstResult() >= 0) {
      query.setFirstResult(sp.getFirstResult());
    }
    if (sp.getMaxResults() > 0) {
      query.setMaxResults(sp.getMaxResults());
    }

    // named parameters
    setQueryParameters(query, sp);

    // execute
    @SuppressWarnings("unchecked")
    List<T> result = (List<T>) query.getResultList();

    if (result != null && log.isDebugEnabled()) {
      log.debug(sp.getNamedQuery() + " returned a List of size: " + result.size());
    }

    return result;
  }
 /**
  * please use #setOrderBy instead
  *
  * @param column
  * @return
  */
 @Deprecated
 public SearchTemplate setOrderDesc(boolean desc) {
   int orderBySize = this.orderBys.size();
   if (orderBySize == 0) {
     this.orderBys.add(new OrderBy("", desc ? DESC : ASC));
   } else if (orderBySize == 1) {
     OrderBy orderBy = this.orderBys.get(0);
     this.orderBys.clear();
     this.orderBys.add(new OrderBy(orderBy.getColumn(), desc ? DESC : ASC));
   } else {
     throw new IllegalStateException("Please use addOderBy");
   }
   return this;
 }