2010-12-15 10 views
9

Ich verwende Hibernate und ich habe diese Anfrage:Hibernate: org.hibernate.hql.ast.QuerySyntaxException: unerwartetes Token

List<Person> list = sess.createQuery("from Person").list(); 

Mit dieser Aussage, erhalte ich alle Personen aus der Datenbank. Aber jetzt möchte ich nur einige Personen.

Meine Datenbank-Schema:

Projekt < - Project_Person -> Person

Also habe ich nur Personen wollen, die ein Mitglied eines Projekts sind.

Mit der SQL-Anweisung für die Datenbank ich das gewünschte Ergebnis:

select * from Person inner join Project_Person 
    on person_id = id 
    where project_id = 1; 

Also dachte ich, ich kann dies mit Hibernate schreiben:

List<Person> list = 
    sess.createQuery(
     "from Person inner join Project_Person 
      on person_id = id 
      where project_id = "+projectId).list(); 

Aber hier bekomme ich einen Fehler:

SERVE: Servlet.service() for servlet myproject3 threw exception 
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 65 [from com.mydomain.myproject.domain.Person inner join Project_Person on person_id = id where project_id = 1] 
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54) 
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47) 
at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82) 
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:284) 
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182) 
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124) 
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) 
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) 
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770) 
at sun.reflect.GeneratedMethodAccessor33.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344) 
at $Proxy26.createQuery(Unknown Source) 
... 

Hat jemand eine Idee, was ist hier falsch?

Mit freundlichen Grüßen.

New Fehler:

SERVE: Servlet.service() for servlet myproject3 threw exception 
org.hibernate.QueryException: could not resolve property: project of: com.mydomain.myproject.domain.Person [from com.mydomain.myproject.domain.Person p where p.project.id = :id] 

n: m Beziehung:

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "Project_Person", 
    joinColumns = {@JoinColumn(name="project_id", referencedColumnName="id")}, 
    inverseJoinColumns = {@JoinColumn(name="person_id", referencedColumnName="id")} 
) 
private Set<Person> persons = new HashSet<Person>(); 


@ManyToMany(mappedBy="persons") 
private Set<Project> projects = new HashSet<Project>(); 

Full Error

Hibernate: select project0_.id as id1_, project0_.createDate as create2_1_, project0_.description as descript3_1_, project0_.name as name1_ from Project project0_ where project0_.id=1 
Hibernate: select person0_.id as id0_0_, project2_.id as id1_1_, person0_.email as email0_0_, person0_.firstName as firstName0_0_, person0_.lastName as lastName0_0_, project2_.createDate as create2_1_1_, project2_.description as descript3_1_1_, project2_.name as name1_1_ from Person person0_ inner join Project_Person projects1_ on person0_.id=projects1_.person_id inner join Project project2_ on projects1_.project_id=project2_.id where project2_.id=? 
15.12.2010 16:42:26 org.apache.catalina.core.ApplicationDispatcher invoke 
SERVE: Servlet.service() for servlet myproject3 threw exception 
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.mydomain.myproject.domain.Person 

Antwort

24

HQL-Abfragen für das Objektmodell geschrieben werden, nicht gegen die Datenbank Schema.

Daher hängt Ihre Abfrage davon ab, wie Sie die Beziehung zwischen Personen und Projekten zugeordnet haben. Zum Beispiel in Person hat eine viele-zu-eins-Beziehung zu Project über project Eigenschaft, wird die Abfrage wie folgt aussehen:

List<Person> list = sess.createQuery(
    "from Person p where p.project.id = :id") 
    .setParameter("id", projectId) 
    .list(); 

EDIT: Im Falle von many-to-many-Beziehung müssen Sie

select p from Person p join p.projects proj where proj.id = :id 

auch nicht, dass Gabe von Parametern über die String-Verkettung ist eine schlechte Praxis, statt setParameter() verwenden.

+0

Hmm, aber es funktioniert nicht. Ich habe meine Frage mit dem neuen Fehler aktualisiert. Ich habe eine Viele-zu-Viele-Beziehung, Fremdschlüssel project_id und person_id – Tim

+0

Jetzt gibt es keinen Hibernate-Fehler mehr, sondern einen anderen: SERVE: Servlet.service() für Servlet myproject3 warf Ausnahme java.lang.ClassCastException: [Ljava .lang.Object; kann nicht in com.mydomain.myproject.domain.Person umgewandelt werden – Tim

+0

Ich aktualisierte meine Frage mit dem vollständigen Fehler und den Hibernate SQL-Anweisungen. Liest es auch Projektwerte und möchte es in die Person einfügen? Ist das die Ursache für den Fehler? – Tim