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; }