今天在學習使用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 是不同的兩個概念