3

在 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, ?, ?)]

我能做些什么来修复它?

4

3 回答 3

0

它看起来像 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))
                )
            );

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

于 2012-05-22T08:52:59.437 回答
0

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

于 2012-06-12T13:45:50.083 回答
0

解决方法

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

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

变通方法将常量参数移出 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')"));
于 2012-08-17T13:25:32.797 回答