【问题标题】:Nhibernate upgraded getting 'Antlr.Runtime.NoViableAltException' on outer join using *=Nhibernate 升级了使用 *= 在外部连接上获取“Antlr.Runtime.NoViableAltException”
【发布时间】:2023-04-02 20:10:01
【问题描述】:

所以我们升级到更新的 Nhibernate 和 Fluent Nhibernate。

现在我得到了这个异常: FailedNHibernate.Hql.Ast.ANTLR.QuerySyntaxException:引发了“Antlr.Runtime.NoViableAltException”类型的异常。靠近第 1 行,第 459 列

在这个 hql 上,升级前运行良好。

选择 s.StudId、s.StudLname、s.StudFname、s.StudMi、s.Ssn、s.Sex、s.Dob、et.EnrtypeId、et.Active、et.EnrId、sss.StaffLname、sss。 StaffFname, sss.StaffMi,vas.CurrentAge FROM CIS3G.Jcdc.EO.StudentEO s , CIS3G.Jcdc.EO.EnrollmentEO e , CIS3G.Jcdc.EO.EnrollmentTypeEO et , CIS3G.Jcdc.EO.VwStaffStudentStaffEO sss, CIS3G.Jcdc。 EO.VwAgeStudentEO vas WHERE (e.EnrId = et.EnrId) AND (s.StudId = vas.StudId) AND (s.StudId = e.StudId) AND (et.EnrtypeId *= sss.EnrtypeId) AND (Isnull (sss .StudStaffRoleCd , 1044 ) = 1044 ) AND (s.StudId = 4000 )

显然它不喜欢 *= 语法,我试过 rewritign 是 as ansi sql 外连接,没有乐趣。

谁能告诉我需要将 sql 更改为什么,以便让外部连接正常工作?

谢谢,

埃里克-

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    我们让它与 ansi sql 一起工作并且调用 nhibernate 略有不同。

    有什么办法可以强制 antlr 允许 t-sql,或者一起停止 antlr 解析?

    在我们得到添加antlr解析的版本之前,所有这些sql都运行良好。

    在很多地方,我们将 T-Sql 传递给 NHibernate,因为我们从另一个应用程序移植,所有复杂的 SQl 都已经编写好了,并且我们希望避免将所有 sql 重写和重新测试为 ansi 标准。

    antrl解析不应该只应用于HQL而不是直接SQL吗?你减少 与其他数据库(如我们的数据库)的本机兼容性。

    谢谢,

    埃里克=

    【讨论】:

      【解决方案2】:

      您不需要与 NHibernate 进行显式连接来获取相关实体。相反,将这些关系映射为多对一。

      例如,您的Student 类可能有一个References(x => x.EnrollmentType)。这样,您只需要选择学生(如果您知道 Id,您甚至不需要 HQL;您可以使用 session.Get),您可以导航到其他属性。

      我建议你阅读NHibernate documentation

      【讨论】:

      • 我担心由于我的工资等级以上的决定,我们必须通过我们的库直接通过 HQL 或 SQL teo nhibernate,并且地图文件不能更改。 Tech 的负责人希望逐步进行休眠,因此我们没有以正常方式使用它。有没有办法通过 HQL 做到这一点?谢谢,埃里克-
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 2011-01-19
      相关资源
      最近更新 更多