[Hibernate] Foute sql bij joined-subclass?

Pagina: 1
Acties:

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

Varienaja

Wie dit leest is gek.

Topicstarter
Ik heb een aantal klassen (waaronder Ligplaats) die allemaal een AuthentiekeEntiteit zijn. Deze klassen heb ik in de hibernate.cfg.xml met een joined-subclass geconfigureerd.

Nu wil ik enkele ligplaatsen selecteren met HQL:
code:
1
from Ligplaats l where (l.Identificatie='LPL02' or l.Identificatie='LPL03')


Als het goed is krijg ik dus maximaal twee records terug (Identificatie is uniek).

Nu poept Hibernate de volgende sql uit:
code:
1
2
3
4
5
6
7
select [een rijtje velden] 
from ligplaats ligplaats0_, authentiekeentiteit ligplaats0_1_ 
where (
   ligplaats0_1_.a1103='LPL02' or 
   ligplaats0_1_.a1103='LPL03'  and 
   ligplaats0_.id058=ligplaats0_1_.id000
)


Dit gaat helemaal mis, en geeft 6 rijen terug met rare gegevens. Ik zie precies wat er misgaat: de haakjes staan verkeerd, want ze moeten zo staan:

code:
1
2
3
4
5
6
7
select [een rijtje velden] 
from ligplaats ligplaats0_, authentiekeentiteit ligplaats0_1_ 
where (
  (ligplaats0_1_.a1103='LPL02' or 
   ligplaats0_1_.a1103='LPL03')  and 
   ligplaats0_.id058=ligplaats0_1_.id000
)

Mijn vraag is nu eigenlijk: wat moet ik hiermee doen? Op het Hibernate forum lijkt niemand het te weten. De sourcecode van Hibernate uitvlooien is een optie, maar ik heb nogal moeite om het te compileren, zodat ik door de code kan steppen.

Of doe ik gewoon iets verkeerds in mijn hql?

Siditamentis astuentis pactum.


  • bloody
  • Registratie: Juni 1999
  • Laatst online: 20:56

bloody

0.000 KB!!

Doe het anders met de Criterion / Criteria interfaces en de Restrictions class.
Dat levert imho ook wat leesbaardere code op.

nope


  • EfBe
  • Registratie: Januari 2000
  • Niet online
los daarvan, is de non-ansi sql natuurlijk redelijk onbeholpen, tenzij de topicstarter op Oracle 8i of ouder zit te werken. Kun je niet ergens configureren dat je ansi-joins wilt?

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


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

Varienaja

Wie dit leest is gek.

Topicstarter
bloody schreef op woensdag 26 oktober 2005 @ 12:40:
Doe het anders met de Criterion / Criteria interfaces en de Restrictions class.
Dat levert imho ook wat leesbaardere code op.
Ik heb even een klein testje gebouwd, een Criteria-query doet het prima. (Maar dat betekent wel een verbouwing in m'n projekt.) Ik vind Criteria overigens totaal niet leesbaar. Duidelijker dan hql (en ook sql) kan het niet worden, vind ik.
EfBe schreef op woensdag 26 oktober 2005 @ 16:21:
los daarvan, is de non-ansi sql natuurlijk redelijk onbeholpen, tenzij de topicstarter op Oracle 8i of ouder zit te werken. Kun je niet ergens configureren dat je ansi-joins wilt?
Ik werk momenteel op Oracle 9i, maar we werken natuurlijk niet voor niets met hibernate. Een vergelijkbaar projekt draait live op DB2/Oracle8/Oracle9/Postgres.

Ik kan bij een joined-subclass helaas niet aangeven dat ik een ansi-join wil.

* Varienaja zucht diep en gaat morgen maar Criteria inbouwen..
...of misschien toch eens proberen of ik in de hibernate code de vinger op de zere plek gelegd kan krijgen.

Siditamentis astuentis pactum.


  • misfire
  • Registratie: Maart 2001
  • Laatst online: 12-10-2024
Welke versie van Hibernate gebruik je nu? In versie 3.1 zijn wat bugfixes en improvements op het gebied van joins toegevoegd, dus misschien dat een nieuwe versie je probleem oplost.

Verder ondersteunt HQL ook joins, het kan best dat als je de query herschrijft met een join je ook een work-around kunt produceren zonder dat je alles ineens met Criteria's enz. hoeft te gaan doen.

  • LAN
  • Registratie: Oktober 2000
  • Niet online

LAN

Als tussentijdse oplossing zou je alleen díe query die problemen heeft kunnen herschrijven naar een query by Criteria.
Kun je in ieder geval verder met je project en kan je er later eventueel nog eens naar kijken.
Varienaja schreef op woensdag 26 oktober 2005 @ 21:40:
[...]

Ik heb even een klein testje gebouwd, een Criteria-query doet het prima. (Maar dat betekent wel een verbouwing in m'n projekt.) Ik vind Criteria overigens totaal niet leesbaar. Duidelijker dan hql (en ook sql) kan het niet worden, vind ik.


[...]

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Varienaja schreef op woensdag 26 oktober 2005 @ 11:25:
Nu wil ik enkele ligplaatsen selecteren met HQL:
code:
1
from Ligplaats l where (l.Identificatie='LPL02' or l.Identificatie='LPL03')


Als het goed is krijg ik dus maximaal twee records terug (Identificatie is uniek).

Nu poept Hibernate de volgende sql uit:
code:
1
2
3
4
5
6
7
select [een rijtje velden] 
from ligplaats ligplaats0_, authentiekeentiteit ligplaats0_1_ 
where (
   ligplaats0_1_.a1103='LPL02' or 
   ligplaats0_1_.a1103='LPL03'  and 
   ligplaats0_.id058=ligplaats0_1_.id000
)
Ik geen kennis van Hibernate, maar qua SQL zou je dit wellicht op kunnen lossen door een IN te gebruiken ipv. een or.
Dus dit:
code:
1
from Ligplaats l where l.Identificatie IN ('LPL02','LPL03')

Dan zou je verwachten dat dit gegenereerd wordt:
code:
1
2
3
4
5
6
select [een rijtje velden] 
from ligplaats ligplaats0_, authentiekeentiteit ligplaats0_1_ 
where (
   ligplaats0_1_.a1103 in ('LPL02','LPL03') and 
   ligplaats0_.id058=ligplaats0_1_.id000
)

Dit zal dan door het DBMS intern wel weer omgeschreven worden tot een or, maar dan neem ik aan dat deze de haakjes wel goed doet.

Who is John Galt?


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Varienaja schreef op woensdag 26 oktober 2005 @ 21:40:
[...]

Ik werk momenteel op Oracle 9i, maar we werken natuurlijk niet voor niets met hibernate. Een vergelijkbaar projekt draait live op DB2/Oracle8/Oracle9/Postgres.
Je begrijpt me niet: de sql die gegenereerd wordt is non-ansi, wat alleen nodig is op oude databases die niet meer gesupport worden door hun leverancier (zoals 8i en eerder). Veelal ondersteunen O/R mappers een setting waarmee je ansi-joins kunt forceren. Maar omdat je project ook op 8i moet werken lijkt me dat in dit geval dus niet aan de orde, want ansi-joins doen het niet op 8i.
Ik kan bij een joined-subclass helaas niet aangeven dat ik een ansi-join wil.
Ook niet ergens in een setting in de mapping file oid? (ik ken hibernate mapping specs verder niet, alleen o/r mapper semantics)
* Varienaja zucht diep en gaat morgen maar Criteria inbouwen..
...of misschien toch eens proberen of ik in de hibernate code de vinger op de zere plek gelegd kan krijgen.
haha, good luck :)

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


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Zomaar een suggestie maar misschien dat from Ligplaats l where ((l.Identificatie='LPL02' or l.Identificatie='LPL03')) wel werkt. :)

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

Varienaja

Wie dit leest is gek.

Topicstarter
Gert schreef op donderdag 27 oktober 2005 @ 11:22:
Zomaar een suggestie maar misschien dat from Ligplaats l where ((l.Identificatie='LPL02' or l.Identificatie='LPL03')) wel werkt. :)
Nee, dat helpt geen fluit.

Ik heb m'n code omgebouwd naar Criteria, maar ik zit nog wel met een paar problemen:
  • Criteria heeft alleen een Expressions.sizeeq(), maar ik heb ook een Expressions.sizelt() en een Expressions.sizegt() nodig. Hoe brouw ik zulke functionaliteit?
  • Ik gebruik soms criteria.createCriteria() om eisen op te leggen aan many-to-one-relaties. Hoe maak ik een NOT daaroverheen? Dus iets als "from Ligplaats l where NOT (l.adres.straatnaam='straat')"

Siditamentis astuentis pactum.


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-04 15:44
EfBe schreef op donderdag 27 oktober 2005 @ 10:50:
[...]

Je begrijpt me niet: de sql die gegenereerd wordt is non-ansi, wat alleen nodig is op oude databases die niet meer gesupport worden door hun leverancier (zoals 8i en eerder). Veelal ondersteunen O/R mappers een setting waarmee je ansi-joins kunt forceren. Maar omdat je project ook op 8i moet werken lijkt me dat in dit geval dus niet aan de orde, want ansi-joins doen het niet op 8i.
Dit is in Hibernate inderdaad mogelijk, door de "dialect" instelling niet als org.hibernate.dialect.OracleDialect maar als org.hibernate.dialect.Oracle9Dialect in te stellen zal Hibernate ANSI joins gebruiken.
Pagina: 1