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

で同様の問題が発生しましたProjections.SqlFunction("concat" ...)。結局、Projections.SqlProjection(...)代わりに使用して回避しました。おそらく移植性が低いと思うので、この答えは好きではありませんが、私にとってはうまくいきました。

于 2012-06-12T13:45:50.083 に答える
0

回避策

group by および SqlFunction パラメーターを使用する場合、NHibernate にバグがあります。「1 つが適用される場合Projections.GroupProperty(customProjection)、プロジェクションのパラメーターは (SELECT句に対して) 1 回だけ送信されますが、GROUP BY句のパラメーターは位置指定されており、クエリでは欠落しています...」(を参照)

同じバグに遭遇し、実行時にカスタム SQL 関数を NHibernate に追加することで解決しました (を参照) 。

この回避策では、定数パラメーターを 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 に答える
0

NHibernate のバグのように見えますが、これらの結果だけが必要な場合は、Projections.GroupProperty の代わりに Projections.Distinct を使用して同じ結果を得ることができます。

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 に答える