Question

Je suis en train d'écrire une requête JPQL avec une clause ORDER BY:

query = "SELECT c FROM item ORDER BY c.name ASC"

Je voudrais définir un paramètre « ordre », dont la valeur serait soit « ASC » ou « DESC »:

query = "SELECT c FROM item ORDER BY c.name :order"

Et puis dans ma mise en œuvre:

query.setParameter("order", "ASC");

Ceci est quand je reçois une erreur Hibernate:

org.hibernate.HibernateException: Errors in named queries

Toute idée sur ce que je fais mal? Merci!

Était-ce utile?

La solution

Le « ASC » ou « DESC » ne peut pas être un paramètre de requête. Vous pouvez utiliser la concaténation de chaîne à la place.

query = "SELECT c FROM item ORDER BY c.name " + sortOrder;

Vous devriez valider que le contenu de sortOrder ne peut être ASC ou DESC et ne vient pas directement de l'utilisateur.

Autres conseils

Si vous souhaitez utiliser des requêtes nommées ici, vous aurez besoin de deux d'entre eux (les requêtes nommées sont statiques et vous ne pouvez pas utiliser ASC et DESC comme paramètre comme hors pointé par @ Mark).

Au lieu d'écrire deux fois une requête nommée contenant un «ordre par clause, vous pouvez mettre en œuvre votre DAO ainsi:

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

Je suppose que la bonne façon utilise clause ORDER BY de l'API Critères

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")));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top