Clausola JPQL ORDER BY con il parametro
-
26-09-2019 - |
Domanda
Sto cercando di scrivere un JPQL query con una clausola ORDER BY:
query = "SELECT c FROM item ORDER BY c.name ASC"
vorrei impostare un parametro di "ordine", il cui valore sarebbe o "ASC" o "DESC":
query = "SELECT c FROM item ORDER BY c.name :order"
E poi nella mia realizzazione:
query.setParameter("order", "ASC");
Questo è quando ottengo un errore Hibernate:
org.hibernate.HibernateException: Errors in named queries
Qualche idea su quello che sto facendo di sbagliato? Grazie!
Soluzione
Il "ASC" o "DESC" non può essere un parametro di query. Si potrebbe utilizzare invece concatenazione di stringhe.
query = "SELECT c FROM item ORDER BY c.name " + sortOrder;
Si dovrebbe convalidare che il contenuto del sortOrder
possono essere solo ASC o DESC e non viene direttamente da parte dell'utente.
Altri suggerimenti
Se si desidera utilizzare query denominate qui, avresti bisogno di due di loro (query denominate sono statici e non è possibile utilizzare ASC e DESC come parametro di come fuori puntato da @ Marco).
Invece di scrivere due volte la query denominata contenente un 'ordine da' la clausola, è possibile implementare il DAO in questo modo:
public List<MyEntity> findByAttribute(boolean desc,...){
TypedQuery<MyEntity> q = em.createNamedQuery(...
q.setParameter(...
List<MyEntity> result = q.getResultList();
if(desc){
Collections.reverse(result );
}
return result;
}
Suppongo modo giusto sta usando clausola ORDER BY di criteri API
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Country> q = cb.createQuery(Country.class);
Root<Country> c = q.from(Country.class);
q.select(c);
q.orderBy(cb.asc(c.get("currency")), cb.desc(c.get("population")));