Unter Bezugnahme auf eine frühere, alias-Feld in einem Abfrage-Kriterien
In dieser Abfrage:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> q = cb.createTupleQuery();
//FROM GamePlayedEvent gpe
Root<GamePlayedEvent> gpe = q.from(GamePlayedEvent.class);
//SELECT gameId, COUNT(*) AS count, AVG(duration)
//AS avDur, AVG(rewardCurrency) AS avCur, AVG(rewardXP) avXp
q.select(cb.tuple(
gpe.<String>get("gameId"),
cb.count(gpe).alias("count"),
cb.avg(gpe.<Double>get("duration")).alias("avDur"),
cb.avg(gpe.<Integer>get("rewardCurrency")).alias("avCur"),
cb.avg(gpe.<Integer>get("rewardXp")).alias("avXp")
));
//WHERE loginTime BETWEEN ...
q.where(cb.between(gpe.<Date>get("time"), fromTime, toTime));
//GROUP BY gameId
q.groupBy(gpe.<String>get("gameId"));
//ORDER BY count DESC
q.orderBy(cb.desc(???));
Wie kann ich die ORDER BY count DESC
, bezieht sich auf das "zählen" definiert, in der SELECT
- Klausel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist, wenn du erfasst die Anzahl Ausdruck, und verwendet es direkt?
Obwohl die Pro JPA 2-Buch beschreibt, dass die alias-Methode kann verwendet werden zum generieren einer sql Abfrage alias (auf Seite 251) hatte ich keinen Erfolg mit damit es funktioniert weder mit EclipseLink oder Hibernate. Für deine Frage würde ich sagen, dass Ihr orderBy Zeile sollte lauten:
wenn es unterstützt wurde, die von den verschiedenen Anbietern.
Soweit meine Forschung geht es Nähte, dass die alias-Methode ist nur für die Benennung von Elementen in die tuble verwendet in der Auswahl (also nur für die Projektion).
Eine Frage habe ich aber. Warum würden Sie wollen, dass die Verwendung der JPA Criteria-API für diese Abfrage. (Die Abfrage) Nähte zu statischer Natur ist, also warum nicht verwenden, JPQL, wo können Sie Ihre Abfrage definieren Aliase direkt.
Haben Sie versucht, die Einrichtung einer Projektion mit einem alias?
Stieß ich auf das gleiche problem heute, aber keine der vorgeschlagenen Lösungen bei mir funktioniert, weil ich brauchte, um die Wiederverwendung der Ausdruck nicht nur in der
order by
Klausel aber auch in dergroup by
- Klausel.Eine offensichtliche Lösung wäre das erstellen eines view auf der Datenbank-Ebene, aber das ist ein bisschen ungeschickt ist, schafft eine Unterabfrage unnötig und auch nicht möglich, wenn der db-user nicht erteilt genug Privilegien. Eine bessere option, die ich landete Umsetzung ist etwas zu schreiben, wie diese
Den ersten Nachteil dieses Ansatzes ist, dass der code ist fehlerträchtig. Der andere Nachteil ist, dass der generierte sql-Abfrage enthält die ordinale position notation, die arbeiten auf einige Datenbanken (wie postgresql oder mariadb), aber nicht funktioniert, auf anderen (wie sql server). In meinem Fall, aber ich fand, dass dies die beste option.
Getestet auf jpa 2.1 mit hibernate 5.2.3 als Anbieter und postgresql 9.6.
Für eine sum-aggregation-Feld habe ich den folgenden code der bei mir funktioniert: