8
votes

Commander des résultats par valeur calculée dans Hibernate

J'ai un joueur de table avec ID de colonnes, Nom, WINS, GAMES_PLAISED. Je l'ai cartographié à un joueur de classe. Je veux faire la requête suivante dans Hibernate (de préférence avec des critères, si ce n'est possible avec des critères HQL aidera également)

Sélectionnez * de la commande du joueur par (gagne / Games_played)

Je m'attends à obtenir la liste triée par leur ratio gagnant.

Merci pour la réponse

palo


0 commentaires

3 Réponses :


2
votes

de l'hibernate Docs -

Les fonctions SQL et les fonctions globales sont autorisées dans la commande et la commande par clauses s'ils sont pris en charge par la base de données sous-jacente.

HTTP: // DOCS .jboss.org / hibernate / noyau / 3.3 / référence / fr / html / queryhql.html # QueryHQL-Commander

Ce qui signifie que vous devez le faire en fonction de votre base de données sous-jacente.


2 commentaires

Merci pour la réponse. Avez-vous une idée de la façon de faire cela avec des critères?


-1: La question concerne expressions arithmétiques (et non des fonctions SQL ou des fonctions d'agrégat) qui sont non prises en charge dans l'ordre par.



12
votes

Hibernate ne prend pas en charge les expressions arithmétiques dans l'ordre par clause. Citant la section 14.12. Le groupe par clause de la documentation hibernate:

Ni le groupe par clause ni l'ordre par clause ne peuvent contenir des expressions arithmétiques.

et en effet, la requête HQL suivante ne renvoie pas correctement les résultats commandés: xxx

et je ne pense pas que vous puissiez diviser org .hibernate.criterion.property de sorte que les critères API ne résoudent pas cela.

Je suggère donc d'utiliser un attribut calculé (avec une formule), par exemple avec Annotations: xxx

Cela permettrait à la requête suivante avec l'API de critère: xxx


2 commentaires

Cela fonctionne également dans .NET avec la mappage fluide à l'aide de la méthode de formule ().


Remarque du futur: Hibernate prend désormais en charge les expressions arithmétiques dans l'ordre par clause: docs.jboss.org/ibernate/orm/5.4/userguide/html_single/...



0
votes

en retard à la fête, mais cela est possible avec une version actuelle de Hibernate (5.4 dans mon cas):

var cb = entityManager.getCriteriaBuilder();
var query = cb.createQuery(Player.class);
var root = query.from(Player.class);

query.orderBy(cb.asc(cb.quot(root.get("wins"), root.get("gamesPlayed"))));

return entityManager.createQuery(query).getResultList();


0 commentaires