Toon posts:

[Hibernate] Groepen van objecten

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Inleiding

Stel ik heb 't volgende object (dat ook gemapt is):

Employee
----------------
ID
FirstName
LastName
Salary

Er zijn een aantal employees, bijvoorbeeld:

1, John, Doe, 4000
2, Maria, Sharapova, 3500
3, John, Johnson, 3000
4, Theo, Huxtable, 4100
5 ...
6 ...
etc.

Probleem
Nu wil ik alle distinct voornamen ophalen, en bij iedere voornaam alle employees met die voornaam. Dus dat is feitelijk een object met 1 property en een verzameling employees, bijvoorbeeld:

code:
1
2
3
4
5
6
John  - 1, John, Doe, 4000 
      - 3, John, Johnson, 3000 

Maria - 2, Maria, Sharapova, 3500 

Theo  - 4, Theo, Huxtable, 4100



Ik zoek me een ongeluk, maar ik kan geen query vinden die dit resultaat kan geven. Ik had gehoopt dat het volgende zou werken:

code:
1
2
3
4
5
6
7
8
ISQLQuery sql = sess.CreateSQLQuery(
   "select e1.FirstName as name, {e2.*} " +
   "from employees e1, employees e2 " +
   "where e1.FirstName = e2.FirstName ")
   .AddScalar("name", NHibernateUtil.String)
   .AddEntity("e2", typeof(Employee));

return sql.List();


Maar dit geeft een lijst terug met telkens een FirstName en een employee met die naam. En dus niet een verzameling van employees:

code:
1
2
3
4
John  - 1, John, Doe, 4000 
John  - 3, John, Johnson, 3000 
Maria - 2, Maria, Sharapova, 3500 
Theo  - 4, Theo, Huxtable, 4100


Vraag
Heeft iemand een idee hoe dit op te lossen is?

Acties:
  • 0 Henk 'm!

  • Observer
  • Registratie: April 2001
  • Laatst online: 21-09 16:24
Je wilt dus gewoon alle employees ophalen gesorteerd op hun voornaam... en dan alleen bij de eerste met een bepaalde voornaam die tonen: dat is presentatie logica, geen datalaag logica en hoort dus niet thuis in een query IMHO.

There are 10 kinds of people in the world: those that understand binary and those that don't


Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:18

Salandur

Software Engineer

goed geobserveert ;)

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Observer schreef op woensdag 04 maart 2009 @ 11:18:
Je wilt dus gewoon alle employees ophalen gesorteerd op hun voornaam... en dan alleen bij de eerste met een bepaalde voornaam die tonen: dat is presentatie logica, geen datalaag logica en hoort dus niet thuis in een query IMHO.
Tja, dat wordt een heel andere discussie ben ik bang. Als ik alle orders van een klant als verzameling in het klant-object wil hebben, dan is dat net zo goed presentatie logica als data logica. Maar goed, daar wil ik het niet over hebben.

Ik ben benieuwd of er voor mijn vraag een oplossing is.

Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:18

Salandur

Software Engineer

nee, want dan heb je een associatie van klant naar order en kan je gewoon een klant object ophalen met alle orders erbij.

In dit geval wil je, gesorteerd op voornaam, alle werknemers laten zien. (beetje kort door de bocht).

Kan je aangeven waarom je het op deze manier wilt doen?

[ Voor 18% gewijzigd door Salandur op 04-03-2009 11:39 ]

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Salandur schreef op woensdag 04 maart 2009 @ 11:38:
nee, want dan heb je een associatie van klant naar order en kan je gewoon een klant object ophalen met alle orders erbij.

In dit geval wil je, gesorteerd op voornaam, alle werknemers laten zien.
Ik wil niks laten zien, in ieder geval niet op een GUI ofzo. Ik wil gewoon een verzameling hebben, waarin die objecten (voornaam + verzameling employees). Ik snap dat het enigszins lijkt op een rapport, maar dat is niet de doelstelling.

Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:18

Salandur

Software Engineer

In dat geval zou ik gewoon itereren over alle employees, gesorteerd op voornaam

[ Voor 69% gewijzigd door Salandur op 04-03-2009 11:51 ]

Assumptions are the mother of all fuck ups | iRacing Profiel


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Maar in een resultset hebben alle rows dezelfde data, dus je kunt niet per voornaam meerdere rows met gegevens ophalen zonder meerdere result-sets te hebben.

Wat ik zou doen is gewoon je lijst met gegevens ophalen en eventueel in je data laag dit doen

code:
1
2
3
4
foreach( Row in Rows )
{
    map[ Row[ VoorNaam ] ].Add( new Persoon( Row ) );
}

Die laat je dan een Dictionary met lijsten bouwen aan de hand van die resultset. Puur in je database zul je het niet voor elkaar gaan krijgen, aangezien die niet de data op die manier aan kan leveren.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Mr_Light
  • Registratie: Maart 2006
  • Niet online

Mr_Light

Zo-i-Zo de gekste.

Sorry dat ik niet heel duidelijk en/of volledig ben in mijn antwoord maar ik heb hibernate al in tijden niet meer aangeraakt.

Wat je wilt kon volgens mij al in 2.1 maar gezien 3.0 toch wel anders is heb ik maar een beetje gekeken in de documentatie.

dit: http://www.hibernate.org/...querying-executing-tuples lijkt te zijn wat je wilt.
sorry dat is het ook niet helemaal.

[ Voor 5% gewijzigd door Mr_Light op 04-03-2009 19:11 ]

IceManX schreef: sowieso


Acties:
  • 0 Henk 'm!

Verwijderd

IntroV: Je moet hiervoor je eigen object maken.

Zoals Woy al zegt: maak een nieuwe dictionary aan. De key-values zijn de unieke voornamen, de value moet een lijst zijn alle employees met die voornaam van bestaan.

In C# zou zo'n dictionary er bijvoorbeeld zo uit kunnen zien:

C#:
1
Dictionary<string,List<Employee>> employeesByName = new Dictionary<string, List<Employee>>();


de string is de voornaam, de lijst Employees is... de lijst employees met die voornaam.

Je moet dus alle data ophalen en "inladen" in deze Dictionary. Dan heb je de data zoals je het wilt hebben.

Cheers,
Pagina: 1