Exception in thread "main" org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token:

今天在学习使用HQL查询的时候,一直报错:

Exception in thread "main" org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: p near line 1, column 45 [select distinct p from com.mao.Person pjoin p.myEvent  where title = :eventTitle]
	at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91)
	at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:304)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:203)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
	at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:131)
	at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:93)
	at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167)
	at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
	at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
	at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1836)
	at com.mao.HqlQuery.findPerson(HqlQuery.java:27)
	at com.mao.HqlQuery.main(HqlQuery.java:14)

看这报错像是HQL语句格式不正确,搞了半天很是郁闷,于是好好看了一下自己的HQL语句:

String hql="select distinct p from Person p"+ "join p.myEvent where title = :eventTitle";
String hql="select distinct p from Person p"+"inner join p.myEvent event where event.happenDate"+"between :firstDate and :endDate";


没感觉出来错误啊,细细观察才找到原因:

当HQL语句在多个""中,要么在前一对""最后部分加空格,要么在下一对引号最前部分加空格!

比如上面的第一条HQL语句在Person p后或者join p前加一个空格就可以了,其实也不难理解,咱们只是为了便于理解把HQL语句放在了不同的""内,它和放在一个""内效果是一样的。如果你每个引号最后部分不加空格,拿上面第一条HQL语句来说就是这样:

String hql="select distinct p from Person pjoin p.myEvent  where title = :eventTitle";

Person pjoin 都连在一起了,自然HQL语句格式不正确,也就报如上错误。因此

当HQL语句在多个""中,要么在前一对""最后部分加空格,要么在下一对引号最前部分加空格!

以上两条HQL语句修改为:

String hql="select distinct p from Person p "+ "join p.myEvent where title = :eventTitle";
String hql="select distinct p from Person p "+"inner join p.myEvent event where event.happenDate "+"between :firstDate and :endDate";

修改后再运行 发现查询成功

Exception in thread

总结:此错误是因为HQL语句格式不正确 解决方案如下:

1:确定HQL语句关键词拼写正确

2:写HQL语句的时候,如果将HQL语句写在了一个""内,只需注意每个关键词之间隔开就可以,如果写在了不同的引号内,要么在前一对引号最后部分加空格,要么在后一对引号最前部分加空格。

另外再说明一下HQL语句:

HQL语句本身是不区分大小写的,像HQL语句中的关键字、函数、都不区分大小写,但是HQL语句中所使用的包名、类名、实例名、属性名都是区分大小写的,比如p.VipMao 和p.vipmao 是不同的两个概念


你可能感兴趣的:(Hibernate)