“附近的语法不正确?”&引用;:Nhibernate生成的查询
我在Nhbernate中使用位置参数时遇到问题 Criteria GroupProperty正在发出包含命名变量和位置变量的sql 本声明:“附近的语法不正确?”&引用;:Nhibernate生成的查询,nhibernate,nhibernate-criteria,Nhibernate,Nhibernate Criteria,我在Nhbernate中使用位置参数时遇到问题 Criteria GroupProperty正在发出包含命名变量和位置变量的sql 本声明: session.CreateCriteria(typeof(MatchStageFrom)) .SetProjection(Projections.GroupProperty( Projections.SqlFunction("substring", NHibernateUtil.St
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')"));
很高兴知道我不是唯一一个经历过这一切的人。很高兴知道我不是唯一一个经历过这一切的人。