“附近的语法不正确?”&引用;:Nhibernate生成的查询

“附近的语法不正确?”&引用;:Nhibernate生成的查询,nhibernate,nhibernate-criteria,Nhibernate,Nhibernate Criteria,我在Nhbernate中使用位置参数时遇到问题 Criteria GroupProperty正在发出包含命名变量和位置变量的sql 本声明: session.CreateCriteria(typeof(MatchStageFrom)) .SetProjection(Projections.GroupProperty( Projections.SqlFunction("substring", NHibernateUtil.St

我在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中的一个bug,但是如果您只是想要这些结果,您可以通过使用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))
                )
            );

或者,如果您选择的不仅仅是名称的第一个字符,那么您可能可以使用subselect使其工作。它看起来像NHibernate中的一个bug,但是如果您只需要这些结果,您可以使用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))
                )
            );

或者,如果您选择的不仅仅是名称的第一个字符,那么您可能可以使用子选择使其工作我在
Projections.SqlFunction(“concat”…)
中遇到了类似的问题。最后,我通过使用
Projections.SqlProjection(…)
解决了这个问题。我不喜欢这个答案,因为我认为它可能不太便于携带,但它确实对我有用。

我在
Projections.SqlFunction(“concat”…)
中遇到了类似的问题。最后,我通过使用
Projections.SqlProjection(…)
解决了这个问题。我不喜欢这个答案,因为我认为它可能不太便于携带,但它确实对我有用。

解决方法

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

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

该解决方法将常量参数从Projections.SqlFunction调用中移出,并移到自定义函数(“year\u 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
      )
    )
)
函数“年\周”的定义如下:

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

解决方法

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

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

该解决方法将常量参数从Projections.SqlFunction调用中移出,并移到自定义函数(“year\u 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
      )
    )
)
函数“年\周”的定义如下:

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

很高兴知道我不是唯一一个经历过这一切的人。很高兴知道我不是唯一一个经历过这一切的人。