【问题标题】:Nhibernate - How to debug "Antlr.Runtime.NoViableAltException"?Nhibernate - 如何调试“Antlr.Runtime.NoViableAltException”?
【发布时间】:2009-11-20 14:11:19
【问题描述】:

通过许多 HQL 查询,我一次又一次地遇到此异常:

Antlr.Runtime.NoViableAltException

这确实是通用且无用的 - 有谁知道如何最好地调试它?显然这是我的 HQL 的一个问题 - 但没有任何线索知道究竟是什么错误,这在很大程度上是一个反复试验的案例。每次看到这个我都在拔头发。

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

有人知道解决这个问题的最佳方法吗?是否有任何用于验证 HQL 查询的工具?

【问题讨论】:

    标签: nhibernate hql


    【解决方案1】:

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

    【讨论】:

    • 你如何分析那里的查询?我已经在那个工具中打开了一个映射,但是查询分析菜单项仍然被禁用。
    【解决方案2】:

    我不能直接帮助你,这里有一些我可以分享的。

    在处理 hibernate 或 nhibernate (NH) 时,我通常通过在 nhibernate 的 log4net 上启用日志记录或/和在 DB 端(例如 mysql)记录查询来进行调试。

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

    【讨论】:

      【解决方案3】:

      例如,如果您遇到以下错误:

      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,并检查是否存在拼写错误,就像我刚刚查看的那样。

      【讨论】:

      • 这有帮助 - 我在 HQL 查询中使用了 ==,呵呵!
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多