Hibernate:org.hibernate.hql.ast.QuerySyntaxException:意外的令牌 [英] Hibernate: org.hibernate.hql.ast.QuerySyntaxException: unexpected token

查看:2000
本文介绍了Hibernate:org.hibernate.hql.ast.QuerySyntaxException:意外的令牌的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 列表< Person>使用Hibernate,我有这个查询: list = sess.createQuery(from Person)。list(); 

使用此语句,我从数据库中获取所有人员。
但是现在我只想要一些人。

我的数据库方案:

项目< - Project_Person - > Person



所以我只想要一个项目成员的人。



数据库中的SQL语句我得到期望的结果:

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

所以我想,我可以用Hibernate编写它:

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

但是在这里我得到一个错误:

<$服务器servlet.service()为servlet myproject3抛出异常
org.hibernate.hql.ast.QuerySyntaxException:意外令牌:在第1行第65列[来自com。 mydomain.myproject.domain.Person在person_id = id处的内部连接Project_Person,其中project_id = 1]
在org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
在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)
在org.hibernate.engine.query.HQLQueryPlan。< init>(HQLQueryPlan.java:101)
在org.hibernate.engine。 < 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)
...

有没有人知道这里有什么不对?







$ b

新错误:服务: Servlet.servi ce()for servlet myproject3抛出异常
org.hibernate.QueryException:无法解析属性:project:com.mydomain.myproject.domain.Person [来自com.mydomain.myproject.domain.Person p其中p。 project.id =:id]

n:m关系:

  @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>();

完整错误

  Hibernate:选择project0_.id作为id1_,project0_.createDate作为create2_1_,project0_.description作为descript3_1_,project0_.name作为name1_从项目project0_ where project0_.id = 1 
Hibernate:选择person0_.id为id0_0_,project2_.id为id1_1_,person0_.email为email0_0_,person0_.firstName为firstName0_0_,person0_.lastName为lastName0_0_,project2_.createDate为create2_1_1_,project2_.description为descript3_1_1_,project2_.name为name1_1_ from Person person0_ inner join Project_person projects1_ on person0_.id = projects1_.person_id内部连接项目project2_ on projects1_.project_id = project2_.id其中project2_.id =?
15.12.2010 16:42:26 org.apache.catalina.core.ApplicationDispatcher invoke
SERVE:Servlet.service()for servlet myproject3抛出异常
java.lang.ClassCastException:[Ljava .lang.Object;无法转换为com.mydomain.myproject.domain.Person


解决方案

< HQL查询是针对对象模型编写的,而不是针对数据库模式。



因此,您的查询取决于您如何映射个人和项目之间的关系。例如,在 Person 项目通过项目属性,查询将如下所示:

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

编辑:在需要多对多关系的情况下

 从Person p中选择p join p.projects proj其中proj.id =:id 

同样不是通过字符串连接传递参数是一种不好的做法,使用 setParameter()相反。


I am using Hibernate and I have this query:

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

With this statement, I get all persons from the database. But now, I only want some persons.

My database scheme:

Project <- Project_Person -> Person

So I only want Persons which are a member of a project.

With the SQL statement on the database I get the desired result:

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

So I thought, I can write this with Hibernate:

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

But here I get an 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)
 ...

Does anyone has an idea what's wrong here?

Best Regards.

New 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 relation:

@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

解决方案

HQL queries are written against the object model, not against the database schema.

Therefore your query depends on how you mapped the relationship between persons and projects. For example, in Person has a many-to-one relationship to Project via project property, the query will look like this:

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

EDIT: In the case of many-to-many relationship you need

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

Also not that passing parameters via string concatenation is a bad practice, use setParameter() instead.

这篇关于Hibernate:org.hibernate.hql.ast.QuerySyntaxException:意外的令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆