0

次のコードを使用して動的にデータをフィルタリングしています (DB エンジンとして MySQL を使用しています)。

var filter = string.Empty;
if (!string.IsNullOrWhiteSpace(filterNumber))
{
    filter = "t.Number LIKE :filterNumber";
}
var query = string.Format("SELECT t FROM Table t WHERE 1=1 AND {0} ORDER BY {1} {2}", filter, orderBy, orderDirection);
var q = Session.CreateQuery(query);
if (!string.IsNullOrWhiteSpace(filterNumber))
{
    q.SetParameter<string>("filterNumber", "%" + filterNumber + "%");
}
q.SetFirstResult(offset);
q.SetMaxResults(limit);
return q.List<Table>();

filterNumber( 、orderByorderDirectionoffsetおよびlimitがメソッドのパラメーターであり1=1、この質問のためだけに追加されたため、クエリは常に機能すると仮定します)

Number が文字列 (MySQL では VARCHAR) 列の場合は機能しますが、日時または整数列の場合は機能しません。

datetime の場合、例外が発生します: could not execute query […] Name:filterDate - Value:%2012%および内部例外はSpecified cast is not validです。

integer/float カラムの例外は: could not execute query […] Name:filterPrice - Value:%100%であり、内部例外はInput string was not in a correct formatです。

(DatePriceは表の別の列)

日付/数値列でこのような LIKE クエリを動的に作成する方法は? この種のクエリは MySQL でうまく機能します。

SELECT * FROM `Table` WHERE `Date` LIKE '%2012%'
4

2 に答える 2

2

@usr のコメントに基づいて、HQL でキャストすることができました。

filter = "CAST(t.Date AS String) LIKE :filterDate";

日付と数値の両方で機能します。

于 2012-11-04T20:14:25.667 に答える
0

避けられるのであれば、日付/数値で LIKE を使用することはおそらくあまり良い考えではありません。年に一致させることが目的の場合は、 year(alias.property) HQL 関数 (これは HQL 構文であるため、クエリを Criteria API に変換する必要はありません) と通常の等号演算子を使用する必要があります。またはより小さい/より大きい。

SQL は varchar への自動キャストを介して機能すると思われますが、パターン マッチングが本当に必要でない限り、日付抽出や BETWEEN での作業に比べてパフォーマンスが大幅に低下すると思います。

パターン マッチングが必要な場合は、日付/数値を文字列にキャストする必要があります。

于 2012-11-04T18:04:57.700 に答える