2010-12-15 10 views
9

estoy usando Hibernate y tengo esta consulta:Hibernate: org.hibernate.hql.ast.QuerySyntaxException: símbolo inesperado

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

Con esta declaración, consigo todas las personas de la base de datos. Pero ahora, solo quiero algunas personas.

mi esquema de base de datos:

Proyecto < - Project_Person -> Persona

Así que sólo quieren que las personas que son parte de un proyecto.

Con la instrucción SQL en la base de datos consigo el resultado deseado:

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

Así que pensé, puedo escribir esto con Hibernate:

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

Pero aquí me sale un error:

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) 
... 

¿Alguien tiene una idea de lo que está mal aquí?

Atentamente.

nuevo error:

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 relación:

@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 

Respuesta

24

consultas HQL se escriben en contra del modelo de objetos, no en contra de la base de datos esquema.

Por lo tanto, su consulta depende de cómo haya mapeado la relación entre personas y proyectos. Por ejemplo, en Person tiene una relación muchos-a-uno a Project través project propiedad, la consulta se verá así:

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

EDIT: En el caso de la relación de muchos a muchos que necesitan

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

Además, no es que los parámetros que pasan a través de la concatenación de cadenas es una mala práctica, el uso setParameter() lugar.

+0

Hmm, pero no funciona. Actualicé mi pregunta con el nuevo error, obtengo. Tengo una relación de muchos a muchos, claves foráneas project_id y person_id – Tim

+0

Ahora, ya no hay ningún error de Hibernate, pero otro: SERVE: Servlet.service() para servlet myproject3 lanzó la excepción java.lang.ClassCastException: [Ljava .lang.Object; no se puede convertir en com.mydomain.myproject.domain.Person – Tim

+0

Actualicé mi pregunta con el error completo y las instrucciones SQL de Hibernate. ¿También lee los valores del proyecto y quiere ponerlo en la Persona? ¿Es esta la causa del error? – Tim

Cuestiones relacionadas