Nhibernate - 如何调试“Antlr.Runtime.NoViableAltException”?

时间:2009-11-20 14:11:19

标签: nhibernate hql

对于许多HQL查询,我一次又一次地得到这个例外:

Antlr.Runtime.NoViableAltException

这是非常通用且无益的 - 有谁知道如何最好地调试这个?显然这是我的HQL的一个问题 - 但是没有任何关于究竟是什么错误的线索,这是一个反复试验的案例。每当我看到这个时,我都会把头发拉出来。

注意,我不想在这里发布任何HQL,因为这是我经常遇到的问题,而不是与一个查询相关的问题。

有谁知道解决这个问题的最佳方法?有没有用于验证HQL查询的工具?

4 个答案:

答案 0 :(得分:7)

看看NHibernate Query Analyzer。它并不完美,但在许多情况下都会有所帮助。

答案 1 :(得分:4)

我无法直接帮助你,这是我可以分享的内容。

在处理hibernate或nhibernate(NH)时,我通常通过启用登录nhibernate的log4net或/和数据库端的查询记录(例如mysql)进行调试。

他们可以告诉我在数据库中制定和执行的查询是什么,以及数据库抛出的异常是什么。

答案 2 :(得分:4)

例如,如果您有以下错误:

Exception of type 'Antlr.Runtime.NoViableAltException' was thrown. near line 1, column
745 [select afe.AFEDataId, afe.Name, afe.AdditionalDescription, afe.ProjectType, 
afe.BusinessUnit, afe.plantId, afe.fuelTypeId, afe.DisplayStatus, afe.BudgetedAmount, 
sum(exp.Amount), afe.CreatedDate from Company.AFE.Model.AFEData as afe inner join 
afe.Expenditures as exp inner join exp.ExpenditureType  where (afe.Status.StatusId = 
:statusId) and (afe.IsRestrictedVisibility = false OR (select count(AFEDataId) from 
Company.AFE.Model.Reader as r where r.AFEData.AFEDataId = afe.AFEDataId AND 
r.Contact.ContactId = '70bc6350-c466-40d5-a067-9d1f00bed7dc') > 0 OR (select count(AFEDataId) 
from Company.AFE.Model.Editor as e where e.AFEData.AFEDataId = afe.AFEDataId AND 
e.Contact.ContactId = '70bc6350-c466-40d5-a067-9d1f00bed7dc') > 0 OR 1=1)  afe.AFEDataId, 
afe.Name, afe.AdditionalDescription, afe.ProjectType, afe.BusinessUnit, afe.plantId, 
afe.fuelTypeId, afe.DisplayStatus, afe.BudgetedAmount, afe.CreatedDate  order by afe.Name ASC]

转到查看提供的原始查询中的字符745,然后检查是否存在拼写错误,就像我刚才看到的那样。

答案 3 :(得分:0)

您使用的是哪个版本的NH,对于最新版本,查询交换有一些更新,如您不能在查询中使用“count(1)”,必须更改为count([别名]),NH将转换为“从...中选择class.id”