2 Stimmen

Hibernate-Spalte "user1_.user_id" muss im GROUP BY-Cluase erscheinen oder in einer Aggregatfunktion verwendet werden.

Ich versuche, eine einfache Abfrage in Hibernate zu schreiben, bei der ich einfach eine absteigend sortierte Liste von Benutzern mit den meisten Punkten bekomme. Im Grunde genommen versuche ich diese Abfrage zu schreiben select user_id from user_points group by user_id order by sum(points) desc. Das funktioniert auf der Postgres-Datenbank, auf der ich arbeite.

Ich habe die folgende HSQL-Abfrage select c.user from UserPoints c group by c.user order by sum(c.points) desc. Die Points-Tabelle hat eine Spalte namens user_id, die sich auf die Benutzertabelle bezieht. In unserem Mapping wird user_id einer Benutzerklasse zugeordnet.

Wenn ich jedoch diese Abfrage ausführe, erhalte ich die Meldung "user1_.user_id" muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden. Ich habe versucht, nach ähnlichen Problemen zu suchen, bin aber nur auf Folgendes gestoßen: JPA Query/Hibernate: Column must appear in the GROUP BY clause or be used in an aggregate function, das unbeantwortet ist.

Ich stecke ein wenig fest mit HQL, weil das andere, was ich tun muss, ist, mich mit einer Tabelle zu verbinden, die keine zugeordnete Assoziation hat (aber auch einen user_id-Schlüssel hat). Ich versuche auch, diese Abfrage so schnell wie möglich zu halten. Jede Hilfe wäre wirklich sehr geschätzt, da ich wirklich verwirrt bin, warum dies nicht funktioniert.

0voto

Niro_S Punkte 21

Also ich denke, ich habe herausgefunden, worum es ging. Tatsächlich haben wir zwei Zuordnungen zur user_id-Spalte. Eine ist ein Attribut, bei dem wir die user_id einfach als reguläre Zahl haben, und die andere ist eine Many-to-One-Zuordnung, bei der wir sie der Benutzerklasse zuordnen. Ich habe das Protokoll auf Debug gesetzt, damit ich die Abfrage sehen kann, die Hibernate erstellt hat, und es scheint, dass es das Select c.user in alle Spalten der Benutzertabelle umwandelte (was bedeutet, dass es die Many-to-One-Zuordnung korrekt verwendet hat), aber aus irgendeinem Grund wurde in der Group-by-Klausel c.user in die user_id-Spalte umgewandelt. Da ich die Zuordnung nicht ändern kann und unter Zeitdruck stehe, habe ich mich dafür entschieden, einfach eine reguläre SQL-Abfrage zu schreiben, um die Benutzer-IDs abzurufen, und dann eine weitere Criteria-Abfrage auszuführen, um alle Benutzer in dieser Liste von IDs zu erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X