对于许多HQL查询,我一次又一次地得到这个例外:
Antlr.Runtime.NoViableAltException
这是非常通用且无益的 - 有谁知道如何最好地调试这个?显然这是我的HQL的一个问题 - 但是没有任何关于究竟是什么错误的线索,这是一个反复试验的案例。每当我看到这个时,我都会把头发拉出来。
注意,我不想在这里发布任何HQL,因为这是我经常遇到的问题,而不是与一个查询相关的问题。
有谁知道解决这个问题的最佳方法?有没有用于验证HQL查询的工具?
答案 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”