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) P>
Sélectionnez * de la commande du joueur par (gagne / Games_played) P> blockQuote>
Je m'attends à obtenir la liste
triée par leur ratio gagnant. P> Merci pour la réponse p>
palo p>
3 Réponses :
de l'hibernate Docs - P>
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. P> blockQuote>
Ce qui signifie que vous devez le faire en fonction de votre base de données sous-jacente. P>
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 i> (et non des fonctions SQL ou des fonctions d'agrégat) qui sont non b> prises en charge dans l'ordre par.
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. p> blockquote>
et en effet, la requête HQL suivante ne renvoie pas correctement les résultats commandés: p>
xxx pré> et je ne pense pas que vous puissiez diviser
org .hibernate.criterion.property code> de sorte que les critères API ne résoudent pas cela. P>
Je suggère donc d'utiliser un attribut calculé (avec une formule), par exemple avec Annotations: p>
xxx pré> Cela permettrait à la requête suivante avec l'API de critère: p>
xxx pré> p>
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/...
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();