Essayez le stockage de la requête nommée sans l'ordre by clause, obtention de la chaîne de requête et ajout des commandes order by clause au moment de l'exécution.
Brian Fields a expliqué dans son blog: http://brainfields.blogspot.com/2009/08/order-by-in-hibernate-named-queries.html
J'ai emballé l'idée pour mon projet:
private static final Pattern badQueryPattern = Pattern.compile("[^\\p{ASCII}]*");
public static String getNamedQueryString(EntityManager em, String queryName) throws SQLException {
Query tmpQuery = em.createNamedQuery(queryName);
SQLQuery sqlQuery = tmpQuery.unwrap(SQLQuery.class);
String queryString = sqlQuery.getQueryString();
if (badQueryPattern.matcher(queryString).matches()) {
throw new SQLException("Bad query string.");
}
return queryString;
}
public static Query getNamedQueryOrderedBy(EntityManager em, String queryName, Map<String, Boolean> columnNames) throws SQLException {
StringBuilder sb = new StringBuilder();
sb.append(ORDER_BY_CLAUSE_START);
int limit = columnNames.size();
int i = 0;
for (String columnName: columnNames.keySet()) {
sb.append(columnName);
if (columnNames.get(columnName))
sb.append(" ASC");
else
sb.append(" DESC");
if (i != (limit - 1)) {
sb.append(", \n");
}
}
Query jpaQuery = em.createNativeQuery(getNamedQueryString(em, queryName)
+ sb.toString()
);
return jpaQuery;
}
Oui merci pour cette API Criteria est la solution. Hibernate s'avère être un ORM très limité. –
Il y a une nouvelle et [possibilité intéressante] (https://stackoverflow.com/a/43900567/5483217) depuis JPA 2.1 – toKrause