[Hibernate/Java] Criteria expressie kan niet joinen

Pagina: 1
Acties:

  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Hoi allemaal,

Ik ben bezig om een criteria expressie op te zetten die gebruik zal maken van een join (inner). Hij moet ongeveer het volgende doen:

SQL:
1
2
3
select this.ID as ID0_, this.PPO_ID as PPO_ID0_, this.DOMAIN_ID as DOMAIN_ID0_, this.FIRSTNAME as FIRSTNAME0_
from WORKMATE this inner join Domain that on this.DOMAIN_ID = that.id
where (this.PPO_ID=24) and that.NAME like '%' 


de 2 tabllen waar het omgaat zijn:
Domain (pk id, fk ppo_id, name)
Workmate (pk id, fk domain_id, fk ppo_id, name, ...)


De applicatie filters zullen dus de where clausule beinvloeden. En die stukje filter ik uit d.m.v. de if else statements. Dus als een if voldoet dan .add(Expression) etc. Op deze manier kan ik makkelijk een sql statement genereren dacht ik.

De code ziet er ongeveer zo uit:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Criteria dom = session.createCriteria(Domain.class);                
if (...) {       
   dom.add( Expression.like( "id", workmate.getDomainId().toString()));
} else if (...){    
   dom.add( Expression.like( "id", "'%'"));
}           
if(...) {   
   dom.add( Expression.like("name", search, MatchMode.ANYWHERE));
} else {    
   dom.add( Expression.like("name", "'%'", MatchMode.ANYWHERE));
}           

Criteria wm = dom.createCriteria("workmate"); // hier klapt die eruit
if (...) {       
   wm.add( Expression.like( "firstname", search, MatchMode.ANYWHERE));       
   wm.add( Expression.like( "lastname", search, MatchMode.ANYWHERE));
} 

if (...) {       
wm.add( Expression.like( "isactive" , workmate.getIsActive(), MatchMode.ANYWHERE));
}
wm.list();


de if en else statement handelen dus het toevoegen van criteria expressies af. Het gaat mis wanneer ik de nieuwe criteria creëer:
Criteria wm = dom.createCriteria("workmate");

Daar klapt die eruit. Ik denk zelf dat hij kijkt naar een overeenkomstige referentie colommen maar in dit geval refereert de workmate.domain_id naar domain.id.
Weet iemand hoe ik die join kan afhandelen?

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

Varienaja

Wie dit leest is gek.

Meestal geeft Hibernate heel uitgebreide foutmeldingen als 'ie eruit klapt'. Het lijkt me nuttig om die melding even te vermelden.

Vaak betreft het gedonder met hoofd- of kleine letters.

Siditamentis astuentis pactum.


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Dit is het stukje met de hibernate error

[15:10:19,500] ERROR PpoAdminEmployeesAction:65 - could not resolve property: workmates of: nl.upi.workmate.pojo.Domain

net.sf.hibernate.QueryException: could not resolve property: workmates of: nl.upi.workmate.pojo.Domain
at net.sf.hibernate.persister.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
at net.sf.hibernate.impl.CriteriaImpl.getClassForPath(CriteriaImpl.java:343)
at net.sf.hibernate.impl.CriteriaImpl.createAlias(CriteriaImpl.java:302)

at net.sf.hibernate.impl.CriteriaImpl.createCriteriaAt(CriteriaImpl.java:380)
at net.sf.hibernate.impl.CriteriaImpl.createCriteriaAt(CriteriaImpl.java:370)
at net.sf.hibernate.impl.CriteriaImpl.createCriteria(CriteriaImpl.java:366)
at nl.upi.workmate.persistence.PpoBD.getWorkmates(PpoBD.java:435)
at nl.upi.workmate.struts.ppo.PpoAdminEmployeesAction.unspecified(PpoAdminEmployeesAction.java:60)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:256)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:115)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:92)
at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:99)
at nl.upi.workmate.persistence.Persistence.doFilter(Persistence.java:132)
at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:163)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:208)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:259)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:363)
at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:490)
at com.caucho.util.ThreadPool.run(ThreadPool.java:423)
at java.lang.Thread.run(Thread.java:534)

Dit maakt mij duidelijk dat hij eruit klapt bij de tweede createCriteria statement. Ik heb daar met hoofd/klein letters en enkel/meervoud gespeeld maar nog geen succes geboekt.

  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
turkosh schreef op dinsdag 06 september 2005 @ 15:20:
Dit is het stukje met de hibernate error

[15:10:19,500] ERROR PpoAdminEmployeesAction:65 - could not resolve property: workmates of: nl.upi.workmate.pojo.Domain

net.sf.hibernate.QueryException: could not resolve property: workmates of: nl.upi.workmate.pojo.Domain
at net.sf.hibernate.persister.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
at net.sf.hibernate.impl.CriteriaImpl.getClassForPath(CriteriaImpl.java:343)
at net.sf.hibernate.impl.CriteriaImpl.createAlias(CriteriaImpl.java:302)

at net.sf.hibernate.impl.CriteriaImpl.createCriteriaAt(CriteriaImpl.java:380)
at net.sf.hibernate.impl.CriteriaImpl.createCriteriaAt(CriteriaImpl.java:370)
at net.sf.hibernate.impl.CriteriaImpl.createCriteria(CriteriaImpl.java:366)
at nl.upi.workmate.persistence.PpoBD.getWorkmates(PpoBD.java:435)
at nl.upi.workmate.struts.ppo.PpoAdminEmployeesAction.unspecified(PpoAdminEmployeesAction.java:60)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:256)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:115)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:92)
at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:99)
at nl.upi.workmate.persistence.Persistence.doFilter(Persistence.java:132)
at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:163)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:208)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:259)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:363)
at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:490)
at com.caucho.util.ThreadPool.run(ThreadPool.java:423)
at java.lang.Thread.run(Thread.java:534)

Dit maakt mij duidelijk dat hij eruit klapt bij de tweede createCriteria statement. Ik heb daar met hoofd/klein letters en enkel/meervoud gespeeld maar nog geen succes geboekt.
Je foutmelding zegt iets over "workmates" terwijl je in je voorbeeld "workmate" gebruikt. Controleer je Domain.hbm.xml eens, heeft die wel een property workmate(s)?

[edit] post die hibernate definitie van Domain eens. Daar zou een set definitie in moeten staan genaamd "workmates", althans, dat lijkt mij het meest logische. In dat geval moet je in je criteria ook "workmates" gebruiken.

[ Voor 6% gewijzigd door zneek op 06-09-2005 22:56 ]


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Ik heb kunnen uitvogelen dat je in hibernate een bi-directionaal associatie moet opzetten. In normaal SQL hebben wij genoeg aan het refereren d.m.v. een foreign key, maar bij hibernate vraagt het ook om het mappen van "child" in de gerefereerde tabel. In dit geval dus "workmates" als children voor domain.
Nu loopt die de criteria wel door, maar klapt uit als ik de list(); uitvoer. waarschijnlijk ergens een NullPointer ofzo. Is het mogelijk om voor de list(); de sql statement ergens te dumpen (op schem b.v.).
in hibernate-config is de show sql al op true gezet, maar die is sql bij execute. ik wil alleen de sql voor de execute even bekijken.

  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
turkosh schreef op woensdag 07 september 2005 @ 10:51:
Ik heb kunnen uitvogelen dat je in hibernate een bi-directionaal associatie moet opzetten. In normaal SQL hebben wij genoeg aan het refereren d.m.v. een foreign key, maar bij hibernate vraagt het ook om het mappen van "child" in de gerefereerde tabel. In dit geval dus "workmates" als children voor domain.
Nu loopt die de criteria wel door, maar klapt uit als ik de list(); uitvoer. waarschijnlijk ergens een NullPointer ofzo. Is het mogelijk om voor de list(); de sql statement ergens te dumpen (op schem b.v.).
in hibernate-config is de show sql al op true gezet, maar die is sql bij execute. ik wil alleen de sql voor de execute even bekijken.
doe maar dom.list(); ipv wm.list(); Of vergis ik me?

Toon de stack trace eens? Hij klapt eruit, leuk, maar met welke melding?

[ Voor 7% gewijzigd door zneek op 07-09-2005 11:58 ]

Pagina: 1