Hibernate - über Java auf Wert einer Aggregatsfunktion zugreifen?

DirkHo

Erfahrenes Mitglied
Hallo,

ich habe mir für Hibernate ein HQL-Statement erzeugt, in dem ich die Aggregatsfunktion SUM() verwende und per SELECT auch nur deren Resultat abfrage:

Code:
SELECT SUM(a.werte) AS summe FROM tabelle a WHERE a.b < 3

Im HQL-Editor der Hibernate Tools liefert mir das Ganze das richtige Ergebnis - aber ich habe nun keinen Plan, wie ich auf diese Resultate zugreifen kann.

Ich habe es schon über query.getReturnAliases() probiert (hörte sich IMHO gut an), aber das warf mir eine Exception.

Vielen Dank schon mal im Voraus und viele Grüße,

Dirk
 
Hallo,
wenn du auf den Summenwert über eine weitere getter-Methode in deinem POJO zugreifen möchtest (getSummeAller();), dann schau mal nach Formula. Das würdest du in deinem Mapping zu dem POJO eintragen.

Wenn du nur den Wert haben möchtest, könntest du eine weitere Methode in deiner DAO-Klasse anlegen.
Dann hast du allerdings in deiner DAO-Klasse eine Methode, die nicht eine Instanz eines POJOs zurückgibt, sondern halt einen int-Wert.
Wenn du das möchtest, suche ich dir mal einen kleinen Codeschnippsel raus.

Hoffe, ich konnte schon mal ein wenig weiter helfen!
Gruß
Gerrit
 
Hallo Gerrit,

danke schön! Ich habe mir das mal durchgelesen, jedoch, wie ich es verstanden habe, sind diese formula "statisch", d.h., dass ich z.B. die WHERE-Klausel nicht zur Laufzeit ändern kann. Genau das müsste ich aber machen - da war mein Beispiel Statement wohl nicht aussagekräftig genug in die Richtung.

Ich will ein int als Parameter an die Methode übergeben können und dann die Abfrage durchführen - mit dem Parameter in der WHERE-Klausel.

Wie würde es denn aussehen, wenn die Abfrage auf kein Objekt gemappt würde? Das wäre grundsätzlich egal.

Vielen Dank und viele Grüße,

Dirk
 
Guten Abend,

hier jetzt mal eine Beispiel-Methode, die du in deine DAO-Klasse einbauen könntest:

Code:
	public String getSum(int val) throws DAOException {
		try {
			begin();
			Query q = getSession().createQuery("SELECT new java.lang.String(SUM(a.werte)) AS summe FROM tabelle a WHERE a.b < :val");
			q.setInteger("val", val);
			String ret = (String) q.uniqueResult();
			commit();
			return ret;
		} catch(HibernateException he) {
			rollback();
			String msg = "Fehler beim Abrufen der Summe.";
			logger.error(msg, he);
			throw new DAOException(msg, he);
		}
	}
Ungetestet :)


Gruß
Gerrit
 
Hallo Gerrit,

danke! Leider hat das auch nicht ganz geholfen. Ich bekomme immer den Fehler, dass Hibernate java.lang.String nicht kennt bzw. wenn ich eine andere Art anwende (mit list() auf den Query zugreifen), dann bekomme ich die Meldung, dass von Double nicht in java.lang.Double gecastet werden kann.

Ich habe es jetzt so gelöst, dass ich über die gefundenen Werte iteriere und diese addiere. Ist zwar nicht so toll und schön, aber hauptsache es geht erst mal und wirklich langsam ist die Seite auch nicht, als dass man da jetzt noch groß rumprobieren müsste (sind auch max. 365 Datensätze).

Vielen Dank nochmals und viele Grüße,

Dirk
 
Zurück