[JPA2] Native query vertalen naar JPQL/Criteria API

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Swinnio
  • Registratie: Maart 2001
  • Laatst online: 14-10 13:19
Zit momenteel met het volgende probleem. Heb een tabel met daarin een kolom 'naam'. Per naam kunnen er meerdere versies zijn opgeslagen. Een versie is een simpele int. Bij een nieuwe versie, wordt er een record met dezelfde naam en een opgehoogde versie toegevoegd. De combinatie naam/versienummer is dan ook uniek.
Nu wil ik van alle records enkel de laatste versie ophalen. In native SQL krijg ik dan zoiets:
SQL:
1
2
3
SELECT t1.* FROM tabel AS t1, 
(SELECT name, max(versienummer) AS latest FROM tabel GROUP BY name) AS t2 
WHERE t1.name = t2.name AND t1.versienummer = t2.latest;

Deze query werkt prima, maar omdat hij native is, kan ik hem niet automatisch mappen op mijn entities. Ik zoek dan ook een JPQL/Criteria variant maar blijkbaar gebruik ik hier een constructie die daarbij niet toegestaan is. Helaas is de foutmelding dermate cryptisch, dat ik niet weet welke constructie wel zou moeten werken.

[ Voor 5% gewijzigd door Swinnio op 22-07-2011 10:03 ]

If the world wouldn't suck, we'd all fall off


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:12

Creepy

Tactical Espionage Splatterer

Wat heb je zelf dan precies gedaan om het toch voor elkaar te krijgen en welke foutmelding kreeg je dan?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Swinnio
  • Registratie: Maart 2001
  • Laatst online: 14-10 13:19
JPQL valt over de subselect: deze mag niet na de komma staan.
SQL:
1
2
3
SELECT t1 FROM Tabel t1, 
(SELECT name, max(versienummer) as latest FROM Tabel GROUP BY text) t2 
WHERE t1.name = t2.name AND u1.versienummer = u2.latest]

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: (

Een andere variant die ik geprobeerd heb, is
SQL:
1
2
SELECT t FROM Tabel t GROUP BY t.name 
HAVING t.versienummer = (SELECT MAX(t.versienummer) FROM t)

Dan heb ik het issue dat t.versienummer niet als property gezien wordt door Hibernate in de HAVING clause (Versie is een embedded entity bestaande uit een versienummer en versiedatum):
java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: t.versienummer

[ Voor 12% gewijzigd door Swinnio op 22-07-2011 11:18 ]

If the world wouldn't suck, we'd all fall off


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 08-10 21:07

Macros

I'm watching...

Nadeel van hql en criteria is inderdaad dat je alles gemapped moet hebben. Je kan naar embedded properties wel refereren met entity.embedded.propertynaam, alleen dat werkt niet altijd overal super lekker. Dan moet je even experimenteren.

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • Swinnio
  • Registratie: Maart 2001
  • Laatst online: 14-10 13:19
Macros schreef op vrijdag 22 juli 2011 @ 11:35:
Nadeel van hql en criteria is inderdaad dat je alles gemapped moet hebben. Je kan naar embedded properties wel refereren met entity.embedded.propertynaam, alleen dat werkt niet altijd overal super lekker. Dan moet je even experimenteren.
Inderdaad, want t.versie.versienummer geeft dezelfde melding, terwijl dit wel overeenkomstig de mapping is.

If the world wouldn't suck, we'd all fall off


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 08-10 21:07

Macros

I'm watching...

Als je het met een criteria query wilt doen, dan heb je misschien iets aan deze post: http://mytselection.blogs...-join-using-criteria.html

Criteria queries hebben iets minder last van embedded entiteiten, maar misschien moet je soms nog wat extra aliases aanmaken.

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • Swinnio
  • Registratie: Maart 2001
  • Laatst online: 14-10 13:19
Macros schreef op vrijdag 22 juli 2011 @ 13:28:
Als je het met een criteria query wilt doen, dan heb je misschien iets aan deze post: http://mytselection.blogs...-join-using-criteria.html

Criteria queries hebben iets minder last van embedded entiteiten, maar misschien moet je soms nog wat extra aliases aanmaken.
Helaas gebruik ik geen Hibernate

If the world wouldn't suck, we'd all fall off

Pagina: 1