-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 9 posts ] 
Author Message
 Post subject: MySQL, GROUP functions und ORDER BY
PostPosted: Thu Sep 08, 2005 7:11 am 
Newbie

Joined: Fri Jun 17, 2005 6:20 am
Posts: 10
Location: Hamburg, Germany
Bei der Migration von einer Oracle DB zu einer MySQL DB (4.0.18) stiess ich auf das Problem, dass
bei MySQL Aggregat-Funktionen in der ORDER BY-Klausel nicht unterstützt werden (Siehe Listing 1).

Folgende Fehlermeldung erhalte ich:
......
JDBCExceptionReporter.logExceptions(71) | SQL Error: 1111, SQLState: HY000
JDBCExceptionReporter.logExceptions(72) | Invalid use of group function
....

Die Möglichkeit, die Sortierung aus der DB-Ebene rauszunehmen und später in Java durchzuführen, möchte ich mir ersparen.

Hat jemand Erfahrung bei der Umschiffung dieses Problems ? Gibt es ein vernünftiges workaround oder sollte ich, da derartige Queries im aktuellen
Projekt häufig vorkommen, einfach auf den Einsatz von MySQL verzichten ?


LISTING 1:

List results = new ArrayList();

StringBuffer querySb = new StringBuffer();
querySb.append(" select new myProject.service.dto.SummaryRow");
querySb.append("(");
querySb.append(" a.name,");
querySb.append(" sum(a.this),");
querySb.append(" sum(a.other),");
querySb.append(" )");
querySb.append(" from ObjectA a ");
querySb.append(" join a.objectB b ");
querySb.append(" group by a.name ");
querySb.append(" order by sum(a.this) desc, sum(a.other) desc");

String queryString = querySb.toString();

try {
Query query = HibernateUtil.getSession().createQuery(queryString);
Iterator iter = query.list().iterator();
while (iter.hasNext()) {
SummaryRow dto = (SummaryRow) iter.next();
results.add(dto);
}
} catch (HibernateException ex) {
throw new InfrastructureException(ex);
}

return results;


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 8:16 am 
Beginner
Beginner

Joined: Fri Feb 11, 2005 12:03 pm
Posts: 48
Location: Kiel, Germany
Du mußt für die Summe eines Alias definieren. Wie das genau mit Hibernate geht, hab ich jetzt noch nicht getestet.

Während z.B. eine Query
Code:
select id,sum(value) from grouptest group by id order by sum(value) desc

mit
Code:
Invalid use of group function
fehlschlägt, liefert die Query
Code:
select id,sum(value) as summe from grouptest group by id order by summe desc
das gewünschte Ergebnis.

Wenn du es damit schaffst, würde mich die Hibernate-Query interessieren.

_________________
Please don't forget to rate if you find this posting useful.


Top
 Profile  
 
 Post subject: MySQL GROUP functions und ORDER BY
PostPosted: Thu Sep 08, 2005 8:46 am 
Newbie

Joined: Fri Jun 17, 2005 6:20 am
Posts: 10
Location: Hamburg, Germany
vielen Dank für Deinen Tipp mit den Spalten-Aliasen

Ich habe es ausprobiert, das läuft aber nicht (siehe Listing 2).

Hibernate schmeisst eine org.hibernate.exception.SQLGrammarException:

Der stack sagt mir, dass Hibernate die Spaltenaliase nicht erkennt.
............
JDBCExceptionReporter.logExceptions(71) | SQL Error: 1054, SQLState: 42S22
JDBCExceptionReporter.logExceptions(72) | Unknown column 'X' in 'order clause'
................

Laut Hibernate Reference Manual soll das Setzen von Spaltenaliasen möglich sein:

You may assign aliases to selected expressions using as:
select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n
from Cat cat

Mein Codebeispiel besagt aber das Gegenteil :-(

Hat da jemand einen Tipp ?


Top
 Profile  
 
 Post subject: Listing 2 als Nachtrag
PostPosted: Thu Sep 08, 2005 8:49 am 
Newbie

Joined: Fri Jun 17, 2005 6:20 am
Posts: 10
Location: Hamburg, Germany
Sorry, hatte das Listing 2 vergessen mitzusenden:


LISTING 2:

List results = new ArrayList();

StringBuffer querySb = new StringBuffer();
querySb.append(" select new myProject.service.dto.SummaryRow");
querySb.append("(");
querySb.append(" a.name,");
querySb.append(" sum(a.this) as X,");
querySb.append(" sum(a.other) as Y ,");
querySb.append(" )");
querySb.append(" from ObjectA a ");
querySb.append(" join a.objectB b ");
querySb.append(" group by a.name ");
querySb.append(" order by X desc, Y desc");

String queryString = querySb.toString();

try {
Query query = HibernateUtil.getSession().createQuery(queryString);
Iterator iter = query.list().iterator();
while (iter.hasNext()) {
SummaryRow dto = (SummaryRow) iter.next();
results.add(dto);
}
} catch (HibernateException ex) {
throw new InfrastructureException(ex);
}

return results;


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 9:24 am 
Beginner
Beginner

Joined: Fri Feb 11, 2005 12:03 pm
Posts: 48
Location: Kiel, Germany
Hab mal im Forum eine Suche nach "order by aggregate function" durchgeführt.
Danach habe ich den Eindruck, daß es zwar prinzipiell geht, aber nicht mit MySQL.

Da müßte man dann auf Plain JDBC zurückgreifen.

_________________
Please don't forget to rate if you find this posting useful.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 10:08 am 
Newbie

Joined: Fri Jun 17, 2005 6:20 am
Posts: 10
Location: Hamburg, Germany
vielen Dank für Deine Recherche und die Quintessenz.

Plain JDBC ist möglich aber keine Lösung, zumal ich aus Performancegründen und wegen der einfachen Handhabarkeit auf den Einsatz von SummaryRow-Objekten nicht verzichten möchte.

Die neueste Version von MySQL, 5.x, scheint sich dieses Problems noch immer nicht angenommen zu haben, zumindest habe ich nichts dergleichen finden können.

Einfach lächerlich.

Da ich nicht weiss, was MySQL sonst noch an unangenehmen Überraschungen bereithält, werde ich die Migration rückgängig machen und mir vorbehalten, zukünftig ganz auf den Einsatz von MySQL verzichten.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 10:14 am 
Newbie

Joined: Fri Jun 17, 2005 6:20 am
Posts: 10
Location: Hamburg, Germany
Unter Oracle habe ich übrigens das gleiche Problem mit den Spaltenaliasen.


Da mich die richtige Verwendung von Spaltenaliasen schon interessiert, ich aber keine Erklärung für das Scheitern in meinem akuellen Projekt habe, werde ich einen neuen Thread zum Thema "Spaltenaliase in Hibernate" aufmachen.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 13, 2005 10:50 am 
Newbie

Joined: Thu Sep 08, 2005 4:53 am
Posts: 7
Location: Cologne, Germany
Ist es nicht generell ein Problem, den Alias in der Order-By Klausel zu verwenden?

Hab es jetzt nicht getestet, aber ich meine mich zu erinnern, dass man im Order-By-Part nie den vergebenen Alias verwenden konnte, sondern immer die Summenfunktion selbst noch einmal angeben mußte.

Wenn Hibernate jetzt aber unbedingt einen Alias haben möchte, dann wäre das durchaus ein Problem.


Vielleicht testest Du mal, ob Hibernate es annimmt, einen Alias für die Gruppen-Funktion zu verwenden, aber keinen im Order-By-Ausdruck?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Oct 28, 2005 3:24 am 
Newbie

Joined: Thu Oct 13, 2005 11:08 am
Posts: 5
vielleicht ist es ein problem das der alias ein reserviertes wort oder in diesem fall eine aggregate function ist.
Vielleicht geht es wenn man es nicht min/max nennt, sondern minValue/maxValue oder so.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 9 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.