3

フラグとして使用される列挙型を含む HQL または Criteria 検索 (後者が推奨されます) を実行する方法。つまり、ある種のフラグを格納する永続的な列挙型プロパティがあります。これらのフラグのいずれかが設定されているすべてのレコードを照会したいと考えています。Eq を使用しても、それが唯一のフラグ セットである場合にのみ真になるため、もちろん機能しません。

Criteria API を使用してこれを解決するのが最善ですが、これが HQL を使用してのみ実行可能であれば、それも良いことです。

4

4 に答える 4

12

基準 API を使用してそれを行う方法は次のとおりです。

[Flags]
enum Bar{
   A = 0x01,
   B = 0x02,
   C = 0x04
}

var criteria = this.Session.CreateCriteria<Foo>()
            .Add( BitwiseFlags.IsSet( "Bar", Bar.A | Bar.C ) );

使用:

public class BitwiseFlags : LogicalExpression
{
    private BitwiseFlags( string propertyName, object value, string op ) :
        base( new SimpleExpression( propertyName, value, op ),
        Expression.Sql( "?", value, NHibernateUtil.Enum( value.GetType() ) ) )
    {
    }

    protected override string Op
    {
        get { return "="; }
    }

    public static BitwiseFlags IsSet(string propertyName, Enum flags)
    {
        return new BitwiseFlags( propertyName, flags, " & " );
    }
}

次の出力 where 句を生成する必要があります。

 FROM _TABLE
 WHERE  (this_.Bar & 5 = 5)

これにより、フラグ Bar.A および Bar.C が設定された行が得られます (他のすべてを除く)。接続詞や選言でも使えるはずです。

于 2011-05-13T08:28:16.223 に答える
6

HQLは簡単です:

var matching = session.CreateQuery(@"
                       from MyEntity
                       where FlagsProperty & :flag = :flag
                       ")
                      .SetParameter("flag", MyEnum.FlagValue)
                      .List<MyEntity>();
于 2010-05-10T22:25:54.047 に答える
3

基準を使用して解決した方法は次のとおりです。

Expression.Eq(
  Projections.SqlProjection("({alias}." + propertyname + " & " + 
    ((int)value).ToString() + ") as " + propertyname + "Result",
    new[] { propertyname + "Result" },
    new IType[] { NHibernateUtil.Int32 }
  ), value );
于 2010-05-14T16:23:52.737 に答える
-2

Expression.Or2 つの値を照会している場合、または 2 つ以上の値を照会している場合に探していExpression.Disjunctionます。

criteria.Add(
  Expression.Disjunction()
    .Add(Expression.Eq("property", value1))
    .Add(Expression.Eq("property", value2))
    .Add(Expression.Eq("property", value3))
)
于 2010-05-10T21:17:04.027 に答える