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.<init>(HQLQueryPlan.java:131)
	at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(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";

修改後再運行 發現查詢成功



總結:此錯誤是因爲HQL語句格式不正確 解決方案如下:

1:確定HQL語句關鍵詞拼寫正確

2:寫HQL語句的時候,如果將HQL語句寫在了一個""內,只需注意每個關鍵詞之間隔開就可以,如果寫在了不同的引號內,要麼在前一對引號最後部分加空格,要麼在後一對引號最前部分加空格。

另外再說明一下HQL語句:

HQL語句本身是不區分大小寫的,像HQL語句中的關鍵字、函數、都不區分大小寫,但是HQL語句中所使用的包名、類名、實例名、屬性名都是區分大小寫的,比如p.VipMao 和p.vipmao 是不同的兩個概念


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章