[Hibernate] Criteria query

Pagina: 1
Acties:

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:30
Ik wil via een criteria query een subselect gebruiken maar het lijkt met niet te lukken. Volgende heb ik:

Ik heb een Booking class en daarin een Bag van Payment classes, ik wil nu alle boeking waarvan de som van "amount" uit de Payment klasse kleiner is dan de "advance" property uit de Booking class.

Het probleem is dat ik geen manier vind om een "gelinkte" query te maken, zoals de query nu geschreven is neemt hij de som van alle payments en niet enkel de payments horende bij een booking.
Java:
1
2
3
4
5
        Criteria criteria = session.createCriteria(Booking.class);
....
                    DetachedCriteria dc = DetachedCriteria.forClass(Payment.class, "payments")
                          .setProjection( Projections.sum("amount")); 
                    criteria.add(Subqueries.lt("advance", dc));

"Live as if you were to die tomorrow. Learn as if you were to live forever"


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

Varienaja

Wie dit leest is gek.

Pff..klinkt lastig.

Moet je niet die DetachedCriteria aan de hoofd-criteria plakken? Dus zoiets als:
Java:
1
2
3
4
        Criteria criteria = session.createCriteria(Booking.class);
        Criteria subCriterium = criteria.createCriteria("payments");
        subCriterium.setProjection(...)
....

[ Voor 64% gewijzigd door Varienaja op 16-09-2005 11:23 ]

Siditamentis astuentis pactum.


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:30
maar dan heb ik nog geen idee hoe ik binnen men hoofdquery dat resultaat van de subquery kan aanspreken.

[ Voor 6% gewijzigd door Cuball op 16-09-2005 11:36 ]

"Live as if you were to die tomorrow. Learn as if you were to live forever"


Verwijderd

Ik begrijp dat je het graag met criteria objecten schrijft maar het gebruik hiervan wordt doorgaans afgeraden. Het voegt namelijk niets toe. Okee eerlijkheid gebied te zeggen dat het wel iets toevoegt: onleesbare code. Waarom gebruik je niet domweg de hibernate query language?

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:30
omdat het een bestaande query is die moet uitgebreidt worden.

offtopic:
ik vind die criteria query's wel handig voor bepaalde opzoekingen, maar alles ermee doen is inderdaad niet echt ideaal.

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • momania
  • Registratie: Mei 2000
  • Laatst online: 17:35

momania

iPhone 30! Bam!

Java:
1
2
3
4
5
Criteria criteria = session.createCriteria(Booking.class);
Criteria subCriterium = criteria.createCriteria("payments");

subCriterium.addProjection(Projection.alias(Projections.sum("amount"), "sumamount"));
criteria.add(Restrictions.ltProperty("advance", "sumamount"));


Zoiets zou volgens mij moeten werken... :)

Je maakt voor de projection op payments een alias en die alias kan je dan vergelijken met je advance kolom van booking ...

Neem je whisky mee, is het te weinig... *zucht*


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:30
heb ik ook al geprobeerd, ik krijg een query in de vorm van :

met een fout dat hij een kolom niet kan vinden in de opgegeven tabellen

code:
1
Hibernate: select sum(payment4_.amount) as y0_ from papabook this_ ....


dus geen subquery binnen men hoofdquery :(

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • momania
  • Registratie: Mei 2000
  • Laatst online: 17:35

momania

iPhone 30! Bam!

Cuball schreef op vrijdag 16 september 2005 @ 12:01:
heb ik ook al geprobeerd, ik krijg een query in de vorm van :

met een fout dat hij een kolom niet kan vinden in de opgegeven tabellen

code:
1
Hibernate: select sum(payment4_.amount) as y0_ from papabook this_ ....


dus geen subquery binnen men hoofdquery :(
Dat betekend dus dat hij de sum als enige item selecteerd?

Door het zetten van projections, komt de resulttransformer op PROJECTION te staan.

Dan moet je de resulttransformer opnieuw zetten door:
Java:
1
crit.setResultTransformer(Criteria.ROOT_ENTITY);

Neem je whisky mee, is het te weinig... *zucht*


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:30
heeft blijkbaar geen effect. Misschien kan je die niet meer achteraf wijzigen die resultTransformer ?

Ik krijg nog altijd dezelfde query structuur met fout

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:30
offtopic:
tis weekend :-) kan pas maandag terug testen, maar ideetjes zijn altijd welkom :-)

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:30
[schop]

iemand nog andere ideetjes hoe ik dit kan oplossen ?

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • momania
  • Registratie: Mei 2000
  • Laatst online: 17:35

momania

iPhone 30! Bam!

mm, geen idee meer nu... loop zelf ook al een tijdje te klooien met die Criteria..

rowcounts, joins en setFirstResult gaan ook niet echt samen :/

Neem je whisky mee, is het te weinig... *zucht*


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:30
ik heb nu als volgt opgelost:

Java:
1
criteria.add(Restrictions.sqlRestriction("{alias}.advance >= (select sum(amount) from papapay where bookingId = {alias}.bookingId)"));


enige nadeel is dat ik rechtstreeks de naam van te tabel (papapay) gebruik in men query...

is hier een manier mogelijk om die op te halen uit de mapping file of dergelijk ?

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • momania
  • Registratie: Mei 2000
  • Laatst online: 17:35

momania

iPhone 30! Bam!

Java:
1
2
3
4
5
6
DetachedCriteria bookCrit = DetachedCriteria.forClass(Booking.class);
DeatchedCriteria payCrit = bookCrit.createCriteria("payments");
payCrit.setProjection( Projections.sum("amount"));

Criteria crit = session.createCriteria(Booking.class);
crit.add(Restrictions.lt("advance", bookCrit);



En zoiets dan?

De eerste DetachedCriteria geeft volgens mij zo alleen een lijstje met het resultaat van sum(amount) per Booking.

Neem je whisky mee, is het te weinig... *zucht*


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:30
lukt ook niet, heb ik wel de Restrictions.lt("advance", bookCrit) vervangen door Subqueries.lt("advance",bookCrit) anders kreeg ik class cast exception en maakt ie ook geen subquery.

volgende result kreeg ik dan:

code:
1
where ? < (select sum(payment1_.amount) as y0_ from papabook this0__)


zoals te zien linkt ie niet naar de huidige boeking en kreeg ik ook een fout dat kolom payment1_ ongedefinieerd is...

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • momania
  • Registratie: Mei 2000
  • Laatst online: 17:35

momania

iPhone 30! Bam!

Is dit de hele subselect die hij doet:
code:
1
select sum(payment1_.amount) as y0_ from papabook this0__

:?

Ik mis daar de join die hij moet doen op de payments en die is wel aangegeven via:
Java:
1
DeatchedCriteria payCrit = bookCrit.createCriteria("payments");

Neem je whisky mee, is het te weinig... *zucht*


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 14:30
komt er vreemd genoeg niet in...

[ Voor 8% gewijzigd door Cuball op 19-09-2005 23:14 ]

"Live as if you were to die tomorrow. Learn as if you were to live forever"

Pagina: 1