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!

È stato utile?

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")));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top