HQL - Problem

  • Themenstarter Themenstarter cwiesing
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
C

cwiesing

Gast
Hallo Zusammen,

ich versuche mich gerade an Hibernate und habe ein "kleines" Problem mit einer Hibernate-Abfrage.

Folgendes Szenario:

Es gibt eine Klasse Appointment, welche ein Attribut owner von Typ User besitzt. Des weiteren gibt es eine Klasse Project, die ein Liste (Set) projectmembers besitzt.

Project und Appointment besitzt keine direkte Beziehung zu einander. Ich brauche nun eine Abfrage, die mir alle Appointment zu einem Project zurückgibt. Also muss ich über die projectmembers gehen.

Ich habe es bisher wie folgt versucht:

Code:
from Appointment a where a.owner in elements(select p.members from Project p where p.id = ?)

Bekomme aber immer folgende eine Exception:
Code:
org.hibernate.hql.ast.QuerySyntaxException: 
expecting CLOSE, found 'p' near line 1, column 70 
[from de.mac.hibernate.Appointment a where a.owner in elements(select p.members from de.mac.hibernate.Project p where p.id = 1)]
	at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
	at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:244)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:155)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:109)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:75)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1583)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
	at $Proxy0.createQuery(Unknown Source)
	at de.mac.service.AppointmentService.getAllAppointmentsFromProject(AppointmentService.java:54)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:58)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	at java.lang.Thread.run(Thread.java:595)

Was mache ich falsch und wie mache ich es richtig?

Danke!

Gruß, Christian
 
was stellt sich jeder als logische erste Frage?
-> funktioniert die Abfrage "select p.members from Project p where p.id = ?" für sich ohne die Verschachtelung?

wenn nein, wozu dann überhaupt die Verschachtelung erwähnen?
schade dass du das entweder noch nicht getestet hast oder das Ergebnis des Tests nicht mitteilst..

oder ist es klar dass das funktioniert?

mir scheint, dass 'Project p' gar nicht geht, sondern es 'Project as p' heißen muss,
klappts damit?

Syntax:
http://www.developer.com/java/ent/article.php/3322131
 
SlaterB hat gesagt.:
was stellt sich jeder als logische erste Frage?
-> funktioniert die Abfrage "select p.members from Project p where p.id = ?" für sich ohne die Verschachtelung?

wenn nein, wozu dann überhaupt die Verschachtelung erwähnen?
schade dass du das entweder noch nicht getestet hast oder das Ergebnis des Tests nicht mitteilst.

oder ist es klar dass das funktioniert?

Sorry, hatte ich bereits getestet. Der Subselect läuft alleine sauber durch.

SlaterB hat gesagt.:
mir scheint, dass 'Project p' gar nicht geht, sondern es 'Project as p' heißen muss,
klappts damit?

Syntax:
http://www.developer.com/java/ent/article.php/3322131

Es klappt beides bzw. beides nicht. Die Abfrage "select ... from Project p" klappt mit und ohne as, aber innerhalb des subselects bekomme ich immer die selbe Fehlermeldung.

Habe mich dabei an der Hibernate-Doku orientiert. Das sind folgende Beispiele:

Für die Arbeit mit set:

The SQL functions any, some, all, exists, in are supported when passed the element or index set of a collection (elements and indices functions) or the result of a subquery (see below).

Code:
select mother from eg.Cat as mother, eg.Cat as kit
where kit in elements(foo.kittens)

select p from eg.NameList list, eg.Person p
where p.name = some elements(list.names)

from eg.Cat cat where exists elements(cat.kittens)

from eg.Player p where 3 > all elements(p.scores)

from eg.Show show where 'fizard' in indices(show.acts)

Für subqueries:

Code:
from eg.Cat as fatcat 
where fatcat.weight > ( 
    select avg(cat.weight) from eg.DomesticCat cat 
)

from eg.DomesticCat as cat 
where cat.name = some ( 
    select name.nickName from eg.Name as name 
)
    
from eg.Cat as cat 
where not exists ( 
    from eg.Cat as mate where mate.mate = cat 
)

from eg.DomesticCat as cat 
where cat.name not in ( 
    select name.nickName from eg.Name as name 
)

Vielleicht ist es auch ein Anfängerfehler, da ich noch nicht so lange mit Hibernate zu tun habe.
 
ich kenne zwar elements() und Sets nicht,
nehme aber mal an, dass elements() nur mit einem Set funktioniert, nicht mit einer ganzen Liste von Sets,

statt Verschachtelung versuche es dann doch mal mit Join,
das ist oft gar nicht langsamer,

from Appointment a, Project p where p.id = ? and a.owner in elements(p.members)

oder ähnlich,
Vorsicht, es können Doppelte auftreten, evtl. distinct benutzen?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben