It’s nice to have all the queries in one place and @NamedQuery give you just that. But what if you need to have parametrized ORDER BY or stuff like that — NamedQueries are static and cannot be modified and ORDER can’t use a parameter.
There is no simple way to customize the NamedQuery, too. You can use setMaxResults but not „setOrder”.
My solution is to read @NamedQuery annotation’s „query” parameter and construct the query myself, adding necessary ORDER BY clause.
The code is (Eclipselink-specific):
import javax.persistence.NamedQuery; import javax.persistence.Query; import org.eclipse.persistence.internal.jpa.EJBQueryImpl; import org.eclipse.persistence.queries.DatabaseQuery; // (...) public String getNamedQueryString(String namedQuery) { Query tmpQuery = entityManager.createNamedQuery(namedQuery); DatabaseQuery databaseQuery = ((EJBQueryImpl) tmpQuery).getDatabaseQuery(); Class resultClass = databaseQuery.getReferenceClass(); NamedQuery annotation = (NamedQuery) resultClass.getAnnotation(NamedQuery.class); // it's possible there's NamedQueries instead of single NamedQuery annotation if (annotation == null) { NamedQueries annotations = (NamedQueries) resultClass.getAnnotation(NamedQueries.class); for (NamedQuery nq : annotations.value()) { if (namedQuery.equals(nq.name())) { annotation = nq; break; } } } return annotation.query(); } // (...)