Dies ist ein Beispiel Einheit:JPA Kriterien Abfragegruppe von Anwendungen nur die ID
public class Account{
@Id
Long id
Double remaining;
@ManyToOne
AccountType type
}
public class AccountType{
@Id
Long id;
String name;
}
Jetzt erstelle ich eine Kriterien-Abfrage mit Join als follwing:
CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createquery();
Root<Account> accountRoot = criteriaQuery.from(Account.class);
Join<Account, AccountType> typeJoin = accountRoot.join(Account_.type);
criteriaQuery.multiSelect(
typeJoin,
criteriaBuilder.sum(accountRoot.get(Account_.remaining))
);
criteriaQuery.groupBy(typeJoin);
Query query = getEntityManager().createQuery(criteriaQuery);
query.getResultList();
Der obige Code wie SQL-Befehl erzeugen folgende:
select accType.id, accType.name, sum(acc.remaining)
from account acc join accType on acc.accounttype_id = accType.id
group by accType.id
Above Code Arbeit in PosgreSQL kann aber in Oracle nicht ausgeführt, weil in ihm accType.name auswählen, die doesn tauche nicht in der group by-Klausel auf.
aktualisieren:
Ich denke, meine Frage ist nicht klar für Sie. Meine Frage betrifft nicht das PostgreSQL- oder Oracle-Verhalten in group by
. Meine Frage ist diese:
Ich verwende typeJoin
in group by
Klausel (das heißt, ich erwarte Winterschlaf verwenden Sie alle Felder von AccountType in group by
), aber warum Hibernate nur Identitätsfeld auf group by
verwenden? wenn ich in group by
nur Identitätsfeld verwenden, dann kann ich die folgende Anweisung:
criteriaQuery.groupBy(typeJoin.get(AccountType_.id)) ;
das ist keine gute Idee. In dieser Lösung änderte sich der AccountType jedes Mal, wenn ich meine Abfragen ändere. Natürlich kann ich damit umgehen, aber ich denke, es muss eine bessere Lösung dafür geben. Sind Sie sicher, dass der Ruhezustand nicht alle Eigenschaften enthalten kann? –
Sie können einfach die accountType.id angeben und anschließend einen Cache der zweiten Ebene verwenden, um sie zu laden. –
Sie könnten natürlich auch das JPA-Metamodell verwenden, um alle Attribute des Entitätstyps abzurufen und sie in die Gruppe aufzunehmen, die generisch wäre. –