[Oracle/Hibernate] GROUP BY probleem

Pagina: 1
Acties:

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 25-01 15:24
Bij de migratie van een applicatie van MySQL naar Oracle ben ik op een vreemd probleem gestuit. Een voor hibernate valide GROUP BY expressie wordt verkeerd naar SQL vertaald, waardoor Oracle het niet meer snapt.

Voorbeeld:
code:
1
2
3
SELECT object
FROM object
GROUP BY object


wordt:
code:
1
2
3
SELECT object.id, object.col_1, ... , object.col_n
FROM object
GROUP BY object.id


Alle kolommen anders dan id komen erbij in de SELECT, terwijl de GROUP BY alleen het id in zich heeft. Logisch dat Oracle hier problemen mee heeft natuurlijk, dit is geen valide SQL.

Hoe krijg ik Hibernate aan zijn verstand dat hij juiste queries uitpoept?

Ik gebruik de volgende versies:
- Hibernate 3.0.5
- Oracle 10.2.0.1.0

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Ik ben hier ook al tegenaan gelopen, maar ik dacht altijd dat mijn HQL fout was. :o Ik gebruik zowel Oracle als PostgreSQL. Ik heb dus geen oplossing voor je, maar ik hoop wel dat iemand die weet; bookmarked!

Siditamentis astuentis pactum.


  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 25-01 15:24
Varienaja schreef op donderdag 13 oktober 2005 @ 10:32:
Ik ben hier ook al tegenaan gelopen, maar ik dacht altijd dat mijn HQL fout was. :o Ik gebruik zowel Oracle als PostgreSQL. Ik heb dus geen oplossing voor je, maar ik hoop wel dat iemand die weet; bookmarked!
Ik ben er toch heel zeker van dat voor het simpele voorbeeld hierboven de HQL goed is :)

Maar blijkbaar slikt MySQL het dus gewoon wel...

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Maar blijkbaar slikt MySQL het dus gewoon wel...
Kan je er nog achter komen wat voor SQL Hibernate genereert voor bovenstaande query in het geval van MySQL? Ik ben benieuwd of dan wel ieder veld van het object in de group-by wordt opgenomen. Als dat zo is, zit er gewoon een fout in de vertaler naar het OracleDialect.

edit:
Volgens de Hibernate-documentatie zou dit gewoon moeten werken:

[code]
select cat from Cat cat
join cat.kittens kitten
group by cat
having avg(kitten.weight) > 100
order by count(kitten) asc, sum(kitten.weight) desc
[/code]


Kan je anders je hele query eens posten, want waarschijnlijk selecteer je uit meerdere tabellen, toch?

[ Voor 37% gewijzigd door Varienaja op 13-10-2005 10:46 ]

Siditamentis astuentis pactum.


  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 25-01 15:24
De hele query posten daar wordt je niet vrolijk van...

Ik heb net MySQL even aangeslingerd en ook voor het MySQL-dialect wordt hetzelfde gegenereerd. Alleen is MySQL dus minder strict dan Oracle.

Alle kolommen zonder aggregate functie moeten in de GROUP BY en Hibernate doet dat niet.

Dus ik denk dat wij pech hebben gehad... :(

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Ik heb het idee dat we toch verkeerde HQL zitten te tikken. Er zijn zoveel voorbeelden met "group by <object>" erin.. dat moet gewoon wel werken. Ik vermoed dat het gedeelte waarin je ge-aggregeerde gegevens selecteerd verkeerd is opgesteld. Misschien gebruik je iets als "count(anderetabel.kolom)", en volgens de voorbeelden moet dat zoiets zijn als:

code:
1
2
3
select foo.id, avg( elements(foo.names) ), max( indices(foo.names) ) 
from eg.Foo foo
group by foo.id


Ik baal ervan dat ik de code van het project waarin ik hetzelfde probleem had niet bij me heb. :-(

Siditamentis astuentis pactum.


  • bloody
  • Registratie: Juni 1999
  • Laatst online: 22:50

bloody

0.000 KB!!

nope


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Je query is onzin, want je wilt een object set ophalen en daarop ook een groupby op uitvoeren. Je krijgt dan een resultset die het resultaat is van een groupby, en elke row is dus een nieuwe entity, semantisch gezien bestaat dat type niet.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1