2009-03-06 10 views
2

Ich arbeite jetzt für eine Weile auf eine Reporting-Anwendungen, wo ich Hibernate verwenden, um meine Abfragen zu definieren. Ich habe jedoch immer mehr das Gefühl, dass dies für die Meldung von Anwendungsfällen nicht der beste Ansatz ist.Die beste Möglichkeit, Hibernate für komplexe Abfragen wie Top-N pro Gruppe zu verwenden

1) Die Abfragen ergeben nur teilweise Spalten und somit keine getippten Objekte (außer Sie werfen alle Felder in Java ein). 2) Es ist schwierig, Abfragen auszudrücken, ohne direkt in sql oder hql zu gehen.

Mein aktuelles Problem ist, dass ich die Top N pro Gruppe bekommen möchte, zum Beispiel die letzten 5 Tage pro Element in einer Gruppe, wo ich an jedem Tag die Anzahl der Besucher anzeigen kann.

sollte das Ergebnis wie folgt aussehen:

| RowName | 1-1-2009 | 2-1-2009 | 3-1-2009 | 4-1-2009 | 5-1-2009 
| SomeName| 1  | 42  | 34  | 32  | 35 

Was ist der beste Ansatz, um die Daten zu transformieren, die pro Tag pro Zeile mit einem Ausgang wie folgt gespeichert ist? Ist es Zeit, auf reguläre SQL zuzugreifen und mit untypisierten Daten zu arbeiten?

Ich möchte wirklich typisierte Objekte für meine Ergebnisse verwenden, aber Java macht mein Leben ziemlich schwer dafür. Irgendwelche Vorschläge sind willkommen!

Antwort

1

anhand der Kriterien-API, können Sie dies tun:

Session session = ...; 
Criteria criteria = session.createCriteria(MyClass.class); 
criteria.setFirstResult(1); 
criteria.setMaxResults(5); 
... any other criteria ... 
List topFive = criteria.list(); 

dies in Vanille-SQL zu tun (und zu bestätigen, dass Hibernate tut, was Sie erwarten) überprüfen this SO post out:

+2

Dies ist in der Tat oben 5, aber nicht pro Gruppe wie in meiner Frage eindeutig erwähnt ... – TomHastjarjanto

+0

Es ist nicht klar aus Ihrem Beispiel, ob die Datenreihen nach Datum sind, und dann schwenken Sie ihre Aggregationen in Spalten? Wenn dies der Fall ist, können Sie die Summierungen in Hibernate mit einer Projektionsliste und einer Summenprojektion durchführen. Führen Sie dann den Drehpunkt in Ihrer Anwendung aus. –