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.getPath());
        orderClausis.append(orderBy.isOrderDesc() ? " desc" : " asc");
        first = false;
      }

      log.debug("appending: [{}] to {}", orderClausis, queryString);

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

    // pagination
    jpaUtil.applyPagination(query, sp);

    // named parameters
    setQueryParameters(query, sp);

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

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

    return result;
  }