[NHibernate] Aggregate query

Pagina: 1
Acties:
  • 562 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Ik ben hier nog eens met een NHibernate vraagstuk.

Ik ben nog wat verder aan het pielen, en ik wil een query uitvoeren die een sum() returned. Dit is op zich niet zo moeilijk; ik doe het zo:
code:
1
2
IQuery q = theSession.CreateQuery ("select sum(ol.Price) from OrderLine ol");
object o = q.UniqueResult();

Dit werkt gewoon goed.

Echter, ik wil dit iets anders doen, ik wil de som van de prijzen * de aantal stuks:
code:
1
2
IQuery q = theSession.CreateQuery ("select sum(ol.Price * ol.NumberOfItems) from OrderLIne ol");
object o = q.UniqueResult();

Dit is andere koek. Ik krijg een exceptie van NHibernate: 'Could not execute query'.
De stacktrace is te herleiden tot een GetOrdinal method van een IDataReader die uitgevoerd wordt.

Echter, als ik de query die NHibernate bouwt en naar sql server stuurt, onderschep, en deze uitvoer in Query Analyzer, dan krijg ik gewoon het goede resultaat.

De query die NHibernate naar Sql Server stuurt, is dit:
select sum(orderline0_.NumberOfItems*orderline0_.ItemPrice) as x0_0_ from tblOrderLine orderline0_
En de exceptie die ik krijg, zegt, dat de FieldNameLookup gefaald heeft, voor field x1_0_
Ja, natuurlijk, het moet x0_0_ zijn, maar hoe komt ie nu bij die x1_0_.
Een bugje in NHibernate ?

[ Voor 17% gewijzigd door whoami op 07-03-2006 21:00 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Dit was blijkbaar ook een bug in eerdere versies Hibernate, waar het opgelost is in versie 3.

Ik zit nu te denken om dit op te lossen, door gebruik te maken van de CreateSqlQuery method, maar hier zit ik blijkbaar met het probleem dat die een persistent class moet returnen, terwijl dit in mijn geval gewoon een decimal moet zijn:
code:
1
theSession.CreateSQLQuery ("....", "bliep", typeof(Decimal));

Over die laatste parameter valt hij dus...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 07-11-2024
Ik denk dat je een wrapper klasse om een Decimal moet maken, beetje dom. 't Is jammer dat NHibernate nog niet op niveau van Hibernate 3 is want er zitten nog wel wat tekortkomingen aan.

Alternatief is natuurlijk de sum op de objecten uit voeren.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Gert schreef op dinsdag 07 maart 2006 @ 22:16:

Alternatief is natuurlijk de sum op de objecten uit voeren.
Dat vind ik zowiezo geen goed alternatief, aangezien het performance-technisch gezien geen goed idee is. :)

Een ander alternatief is natuurlijk om hier geen NHibernate voor te gaan gebruiken, maar da's dan ook weer jammer.

[ Voor 18% gewijzigd door whoami op 07-03-2006 22:30 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Nu ik er over nadenk, een sum op de objecten zelf is misschien toch een alternatief; wel niet zo mooi, maar goed...

* whoami heeft toch maar ff een bug report gesubmitted.

[ Voor 20% gewijzigd door whoami op 08-03-2006 09:01 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Ik probeer er nu idd even rond te werken, door gewoon alle OrderLines voor een bepaalde Customer op te vragen, en ze dan even zelf op te tellen.
Ik doe dit nu zo:
code:
1
2
IQuery q = s.CreateQuery ("from OrderLine ol inner join Order inner join Customer " +
                                      "where Customer.Id = :custId");

Echter, ook van deze query gaat ie over z'n nek; ik krijg een foutmelding:
BY expected after GROUP or ORDER ...
Ik heb gewoon nergens een GROUP BY of ORDER BY.
Doe ik hier nu weer wat verkeerd, of hoe zit het.

Ik krijg het een beetje op m'n heupen van die wazige foutmeldingen

[ Voor 6% gewijzigd door whoami op 09-03-2006 20:33 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Ok, ik heb het nu zo opgelost:
code:
1
2
3
IQuery q = s.CreateQuery ("select ol " +
                        "from OrderLine ol, Order o, Customer c " +
                        "where ol.Owner = o and o.Owner = c");

Dit werkt (dit levert wel 4 sql queries op zie ik).
Echter, als ik het met de 'join syntax' wil doen, marcheert het niet:
code:
1
select ol from ShopDomain.OrderLine ol inner join ShopDomain.Order o inner join ShopDomain.Customer c

Dit levert een "outer or full join must be followed by path expression" op.
:?

Als ik m'n werkende query echter uitbreidt met een extra where clause:
code:
1
2
3
IQuery q = s.CreateQuery ("select ol " +
                        "from OrderLine ol, Order o, Customer c " +
                        "where ol.Owner = o and o.Owner = c and c.Id = :custId");

Dan levert mij dit ook een exceptie op:
Could not ressolve property:Id of of :ShopDomain.Customer
Terwijl mijn class Customer echt wel een Id property heeft, maar die is wel read-only (getter only).
Echter, als ik er ook een set bij maak (in die property), dan lost dat niks op.

[ Voor 4% gewijzigd door whoami op 09-03-2006 20:52 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Ok, Ik heb gevonden waarom ik die 'could not resolve property' exceptie krijg.
Dit is omdat ik die Id property niet in m'n mapping file heb opgenomen.
Ik heb wel het key element in m'n mapping file staan, maar deze refereert direct naar het field '_id'.
De property Id is read-only.
Ik heb nu in m'n mapping file die Id property opgenomen, met een update="false" en insert="false" attribute, echter, nu krijg ik een exceptie bij het ophalen van een Customer; hij kan de value van de Id property niet zetten via reflection (wat logisch is, want deze is read-only (getter)).
Er moet dus wel een manier zijn denk ik om in je mapping file aan te geven dat een property read-only is, dus dat moet ik nog even opzoeken.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
kun je in je query in de topicstart de sum() niet aliasen naar een naam?

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


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Nee, dat had ik ook al eerst geprobeerd, maar daar krijg ik ook een exceptie op; blijkbaar aanvaardt NHibernate geen aliassen op column-niveau.
Ik krijg een fout
, expected in select
Die fout die ik krijg, die iets zegt over die 'By expected after ORDER' zal ws veroorzaakt worden door het feit dat ik een class heb die Order heet, en order ook een reserved woord zal zijn.
Is er een manier op classnames te escapen in HQL ?

[ Voor 39% gewijzigd door whoami op 09-03-2006 21:25 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Uit pure miserie probeer ik nu dus maar eens met de CreateSQLQuery method te werken.

code:
1
2
3
IQuery q = s.CreateSQLQuery ("select ol.* from tblOrderLine ol " +
                                   " inner join tblOrder o on o.Id = ol.OrderId",
                                   "ol", typeof(OrderLine));

Maar ook dat wil niet meewerken.
Hier wordt de query iig al naar Sql server gestuurd, maar ik krijg een exception die in de buurt ligt van de oorspronkelijke fout:
FieldNameLookUp failed for Id0_
Ja, logisch want ik doe gewoon een select *
ik zie die aliassen ook helemaal niet.

Wat een miserie en frustratie voor zoiets simpels als een select sum( bla * bliep)

[ Voor 7% gewijzigd door whoami op 09-03-2006 21:36 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
All hail the property access modifiers in .NET 2.0, die je nu voor een get / set apart kunt definieren.

Ik heb m'n mapping file aangepast, met die extra Id property (zoals ik eerder vemeld heb).
Ik heb de Id property op de Customer class een private setter gegeven, en nu werkt het zo ongeveer denk ik.
Nog ff verder pielen.

Maar dit is echt frustrerend. Ik ben nu 2 uur bezig met zo iets simpels.
Improve the productivity with an O/R mapper blahblahbla.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
whoami schreef op donderdag 09 maart 2006 @ 21:49:
Improve the productivity with an O/R mapper blahblahbla.
Tja, er zijn ook O/R mappers die wel productive zijn ;) :P </opendeur>

[ Voor 3% gewijzigd door EfBe op 10-03-2006 09:11 ]

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


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
EfBe schreef op vrijdag 10 maart 2006 @ 09:10:
[...]

Tja, er zijn ook O/R mappers die wel productive zijn ;) :P
Vandaag toevallig een intro gehad over LLBLGen. :P
Met hoeveel man (/vrouw) werken jullie daar eigenlijk aan ?

Ik heb m'n gevecht met NHibernate ook even op m'n blog geplaatst
klik

[ Voor 8% gewijzigd door whoami op 10-03-2006 18:50 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
whoami schreef op vrijdag 10 maart 2006 @ 18:13:
[...]
Vandaag toevallig een intro gehad over LLBLGen. :P
Hey cool! Een collega die een demo gaf oid?
Met hoeveel man (/vrouw) werken jullie daar eigenlijk aan ?
1 full time dev (ik), 1 project manager en 3 support team leden

Je blog geeft een 403 error btw.. (bij refresh deed hij het wel)

[ Voor 10% gewijzigd door EfBe op 10-03-2006 22:51 ]

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


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
EfBe schreef op vrijdag 10 maart 2006 @ 22:50:
[...]

Hey cool! Een collega die een demo gaf oid?
Idd.
1 full time dev (ik), 1 project manager en 3 support team leden
Straf.
En wie schrijft al de documentatie dan ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
whoami schreef op zaterdag 11 maart 2006 @ 17:41:
[...]
Straf.
En wie schrijft al de documentatie dan ?
De projectmanager en ikzelf (de meeste pages). Maar op een gegeven moment heb je wel een goede basis dus zijn nieuwe features niet zo ingrijpend meer qua docs (die nu zo'n 350 printed pages beslaan)

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


Acties:
  • 0 Henk 'm!

  • Scare360
  • Registratie: Juli 2001
  • Laatst online: 19-08 16:50
whoami schreef op dinsdag 07 maart 2006 @ 22:29:
[...]

Een ander alternatief is natuurlijk om hier geen NHibernate voor te gaan gebruiken, maar da's dan ook weer jammer.
De rede waarom wij naar IBatis zijn overgestapt.

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
paulgielens schreef op zondag 12 maart 2006 @ 01:55:
[...]
De rede waarom wij naar IBatis zijn overgestapt.
Was dat niet omdat jullie geen dyn. SQL mochten uitvoeren? Ik bedoel, hiervoor hoef je echt niet over naar stored procedure narigheid:

code:
1
2
DataAccessAdapter adapter = DataAccessAdapter();
Decimal result = (Decimal)adapter.GetScalar(OrderLineFieldIndex.Price, (OrderLineFields.Price * OrderLineFields.NumberOfItems), AggregateFunctions.Sum);


en dat is alles. Geen stored procedure narigheid, geen queries in strings, maar Linq-eske queries die compile-time checked zijn.

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


Acties:
  • 0 Henk 'm!

  • Scare360
  • Registratie: Juli 2001
  • Laatst online: 19-08 16:50
EfBe schreef op zondag 12 maart 2006 @ 12:12:

Was dat niet omdat jullie geen dyn. SQL mochten uitvoeren? Ik bedoel, hiervoor hoef je echt niet over naar stored procedure narigheid:
Ook, maar NHibernate ondersteund sprocs. Helaas was NHibernate destijds v0.9 en ging/gaat de ontwikkeling erg langzaam.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Is iBatis niet dat systeem waar je eigenlijk zelf nog je queries moet gaan schrijven ? :? Of zie ik dat nu mis ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
paulgielens schreef op zondag 12 maart 2006 @ 22:14:
[...]
Ook, maar NHibernate ondersteund sprocs. Helaas was NHibernate destijds v0.9 en ging/gaat de ontwikkeling erg langzaam.
Volgens mij alleen voor selects en dan ook nog onder stricte voorwaarden. Ja development van nhibernate gaat niet echt snel, en nadat ze een publieke oproep hadden gedaan voor hulp bij een nieuwe port van hibernate 3 naar .net weet ik niet of het uberhaupt wel wat wordt.

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


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Ik heb even NHibernate 1.2.0 (alpha) gedownloaded, en het probleem is er nog steeds.

Nu, ik heb even zitten kijken of ik het kan oplossen dmv een native sql query.
Hiervoor zou ik de method CreateSQLQuery kunnen gebruiken, echter, deze method neemt 3 argumenten.
De 3de parameter werkt een beetje tegen: daar wordt er een type van een mapped-class verwacht.
Echter, ik wil helemaal geen mapped class terugkrijgen van die query; ik wil gewoon een decimal terugkrijgen...

Iemand een idee hoe ik dat kan tewerkstelligen ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Deze bug is ondertussen gefixed in NHibernate.

https://fgheysels.github.io/

Pagina: 1