【问题标题】:Incorrect Syntax near "?" : Nhibernate Generated Query“?”附近的语法不正确: Nhibernate 生成的查询
【发布时间】:2012-05-22 06:03:13
【问题描述】:

我在 Nhbernate 中使用位置参数时遇到问题。

Criteria GroupProperty 发出带有命名变量和位置变量的 sql。

此声明:

session.CreateCriteria(typeof(MatchStageFrom))
                .SetProjection(Projections.GroupProperty(
                    Projections.SqlFunction("substring", NHibernateUtil.String, Projections.Property("LastName"), Projections.Constant(0), Projections.Constant(1))
                    )
                );

正在生成此 SQL:

SELECT substring(this_.LAST_NAME, @p0, @p1) as y0_ FROM MATCH_STAGING_FROM this_ GROUP BY substring(this_.LAST_NAME, ?, ?)

导致 SQL 出错:

Incorrect syntax near '?'.

could not execute query
[ SELECT substring(this_.LAST_NAME, @p0, @p1) as y0_ FROM MATCH_STAGING_FROM this_ GROUP BY substring(this_.LAST_NAME, ?, ?) ]
Positional parameters: #0>0 #1>1 #2>0 #3>1
[SQL: SELECT substring(this_.LAST_NAME, @p0, @p1) as y0_ FROM MATCH_STAGING_FROM this_ GROUP BY substring(this_.LAST_NAME, ?, ?)]

我能做些什么来解决它?

【问题讨论】:

  • 很高兴知道我不是唯一经历过这种情况的人。

标签: nhibernate nhibernate-criteria


【解决方案1】:

它看起来像 NHibernate 中的一个错误,但如果您只想要这些结果,您可以通过使用 Projections.Distinct 而不是 Projections.GroupProperty 来获得相同的结果,即:

session.CreateCriteria(typeof(MatchStageFrom))
            .SetProjection(Projections.Distinct(
                Projections.SqlFunction("substring", NHibernateUtil.String, 
                    Projections.Property("LastName"), 
                    Projections.Constant(0), 
                    Projections.Constant(1))
                )
            );

或者,如果您选择的不仅仅是名称的第一个字符,那么您可以使用子选择使其工作

【讨论】:

    【解决方案2】:

    我遇到了与Projections.SqlFunction("concat" ...) 类似的问题。最后,我改用Projections.SqlProjection(...) 解决了这个问题。我不喜欢这个答案,因为我认为它可能不太便携,但它确实对我有用。

    【讨论】:

      【解决方案3】:

      解决方法

      NHibernate 在使用 group by 和 SqlFunction 参数时存在一个错误。 “如果应用Projections.GroupProperty(customProjection),则投影中的参数仅发送一次(对于SELECT 子句),而GROUP BY 子句中的参数是定位的并且在查询中丢失......” (see)

      遇到同样的错误并通过在运行时向 NHibernate 添加自定义 SQL 函数来解决它, (see)

      解决方法将常量参数从 Projections.SqlFunction 调用中移到自定义函数的定义中(“year_week”)。

      老失败:

      Projections.GroupProperty(
         Projections.Cast(NHibernateUtil.AnsiString,
            Projections.SqlFunction("to_char", NHibernateUtil.AnsiChar,
               Projections.Property(() => myAlias.Date),
               Projections.Constant("IYYYIW") // Turns into "?" in group by
            )
         )
      )
      

      解决方法:

      Projections.GroupProperty(
         Projections.Cast(NHibernateUtil.AnsiString,
            Projections.SqlFunction("year_week", NHibernateUtil.AnsiChar,
               Projections.Property(() => myAlias.Date)
               // constant moved to function definition
            )
          )
      )
      

      函数“year_week”定义如下:

      DialectExtensions.RegisterFunction(sessionFactory, "year_week", new SQLFunctionTemplate(NHibernateUtil.String, "TO_CHAR(?1,'IYYYIW')"));
      

      【讨论】:

        猜你喜欢
        • 2015-03-25
        • 2014-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-15
        • 2017-02-26
        • 1970-01-01
        • 2015-12-12
        相关资源
        最近更新 更多