2012-05-22 30 views
2

我在使用Nhbernate中的位置参数时遇到问题。“?”附近的语法错误:Nhibernate生成的查询

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

我能做些什么来解决这个问题?

+1

很高兴知道我不是唯一一个谁经历过这个。 –

回答

0

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

另外,如果你是选择的不仅仅是名字的第一个字符,那么你可能可以让它使用子查询

0

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

0

解决方法

使用组由和SqlFunction参数当在NHibernate的一个错误。 “如果一个应用Projections.GroupProperty(customProjection),在投影参数只发送一次(对SELECT条款),而GROUP BY子句中的参数位置,并在查询失踪......” (see

然同样的漏洞,并解决它在运行时添加自定义SQL函数NHibernate的, (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')"));