最近在改一份二手代碼的時候,項目運行報了個java.lang.IllegalArgumentException: node to traverse cannot be null異常。
WTF?!難道我HQL寫錯了?!我只是添加了一個update方法而已啊!
這里使用的是JPA的Query注解,其實語法跟HQL是一樣的,我已經(jīng)把這行HQL每個空格都TM檢查過了,沒有發(fā)現(xiàn)任何奇怪的東西,沒辦法了只好調(diào)試一下源碼
最先拋出異常的是在Hibernate的orghibernatehqlinternalastutilNodeTraverser.java:46,這里判斷如果AST為空,則拋出異常,那AST到底是個啥啊?
通過跟蹤NodeTraverser的調(diào)用,可看到ACT是從parser獲取的,而這里的parser實際上就是Hibernate的Hql語法分析器!因此網(wǎng)上很多文章都會得出本文提到的異常就是HQL語法錯誤導(dǎo)致的了。但是我這個HQL明顯沒有語法錯誤的,問題又出在哪呢?我們加個短點瞧一瞧:
好玩的事情來了,如果HQL是select開頭的話,是不會報錯的
等到一條update了,果然parser處理后的hqlAst是空的對比上面Select語句就可以明顯看出問題所在了:問題出在了parser.statement()里,那跟進去看看囖:
逐行調(diào)試,發(fā)現(xiàn)在執(zhí)行updateStatement()時拋出異常,再跟進去:
跑到default去了
因為LA(1)是41,不在switch的任何分支里,然后實際上我在這花了很多時間,都浪費在看antrl的源碼上了,就是想搞明白LA是在那里設(shè)值的,結(jié)果越看越懵逼,但實際上我們可以換個思路,通過監(jiān)控每一步執(zhí)行后的各個變量可以發(fā)現(xiàn)有這樣的規(guī)律:
上圖是在執(zhí)行match(UPDATE)前,各個主要變量如圖所示
直到執(zhí)行了match方法后,LA(1)變?yōu)榱?1,而同時,LT(1)里的值引起了我的注意:
上面已經(jīng)提到過了,實際上這部分代碼是Hibernate的HQL語法解析器,那講道理的話,第一次執(zhí)行,處理完UPDATE關(guān)鍵字,往后應(yīng)該是第二個關(guān)鍵字,而實際上我們的HQL中根被沒有order這個詞啊,為什么會導(dǎo)致報錯呢?
還記得上面的某個斷點么,就是調(diào)用parser.statement()的地方,來看看交由parser處理時的hql是什么樣子的
你們發(fā)現(xiàn)問題了嗎?Hibernate在處理hql的時候,是會把包名補全的,而這個實體類的包名是以order開頭的!update關(guān)鍵字后不能有order關(guān)鍵字...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/76583.html
摘要:解決的中只有一個生命周期的鉤子也只有一句代碼報錯中的就是整個組建中的原來是寫在了使用指令的后面所以此時還沒有在組件中注冊所以會報錯誤正確代碼標(biāo)題這是一段內(nèi)容這是一段內(nèi)容這是一段內(nèi)容這是一段內(nèi)容。 用于記錄coding過程中遇到的比較難解決或者有意思的問題,包括前端/后端(Node/Db),會持續(xù)更新... 后端 Node redis集群模式下pipline報錯(2019.3.14) ...
摘要:解決的中只有一個生命周期的鉤子也只有一句代碼報錯中的就是整個組建中的原來是寫在了使用指令的后面所以此時還沒有在組件中注冊所以會報錯誤正確代碼標(biāo)題這是一段內(nèi)容這是一段內(nèi)容這是一段內(nèi)容這是一段內(nèi)容。 用于記錄coding過程中遇到的比較難解決或者有意思的問題,包括前端/后端(Node/Db),會持續(xù)更新... 后端 Node redis集群模式下pipline報錯(2019.3.14) ...
摘要:第二步自終止,第三步自調(diào)用,第四步回調(diào)函數(shù)會重復(fù)進行,直到我們遍歷到樹的所有節(jié)點。執(zhí)行回調(diào)函數(shù),傳入賦值為第二層第二個子節(jié)點。 本文譯自Cho S. Kim的文章:Data Structures With JavaScript: Tree 樹,是web開發(fā)中最常用的數(shù)據(jù)結(jié)構(gòu)之一。這句話對開發(fā)者和用戶來講,都適用:開發(fā)人員通過HTML創(chuàng)造了一個DOM,用戶則通過DOM消費網(wǎng)絡(luò)信息。 ...
閱讀 3871·2021-07-28 18:10
閱讀 2580·2019-08-30 15:44
閱讀 1087·2019-08-30 14:07
閱讀 3464·2019-08-29 17:20
閱讀 1579·2019-08-26 18:35
閱讀 3538·2019-08-26 13:42
閱讀 1820·2019-08-26 11:58
閱讀 1591·2019-08-23 18:33