0

という名前の単一のクラスがあり、このクラスには列挙値Userのコレクションがあります。UserRole

public class User {
    ...
    public ICollection<UserRole> UserRoles { get; private set; }
    ...
}

[Flags]
public enum UserRole {
    Beginner = 1,
    Advanced = 2,
    Expert = 4,
    Admin = 8
}

UsertoUserRole関係は多対多の関係であり、3 つのテーブル (userId と roleId のみを持つ tblUser、tblRole、および tblUserRole) で実装されます。HBM は次のとおりです。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false">
   <class name="User, SampleDll" table="tblUser">
   ...
   <bag name="UserRoles" table="tblUserRole" cascade="all-delete-orphan" fetch="join">
      <key column="UserId"/>
      <element column="RoleId" type="UserRole, SampleDll" />      
   </bag> 
   ...
   </class> 
</hibernate-mapping> 

今、同じセマティクスを持つ基準を作成したいと思います

select u.* from tblUser u 
left join tblUserRole ur on ur.UserId = u.UserId
where ur.RoleId = @USER_ROLE

UserRoleenum用の別のマッピング ファイルを使用せずに、(queryOver または分離された基準を使用して) そのような基準を実現することは可能ですか?

ヒントを事前にありがとう。

Mrks

4

1 に答える 1

0

基本的にすでに値のコレクションである flags 列挙型が既にあります。そのためには、テーブル UserRoles と Roles も必要ありません。User の単純な列だけで十分です。

[Flags]
public enum UserRoles {
    Beginner = 1,
    Advanced = 2,
    Expert = 4,
    Admin = 8
}

public virtual UserRoles Roles { get; private set; }

<property name="Roles" column="UserRoles"/>

本当に次のようなものが必要な場合:

public class User {
    ...
    public virtual ICollection<UserRole> Roles { get; private set; }
    ...
}

public class UserRole {
    public virtual int Id { get; set; }

    ...
}

それから

<bag name="Roles" table="tblUserRole" cascade="none"> <!-- none because Roles are somewhat static not per user -->
   <key column="UserId"/>
   <many-to-many column="RoleId" class="UserRole, SampleDll" />      
</bag>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="UserRole" table="Roles">
    <id name="Id"/>
    <!--additional properties-->
  </class>
</hibernate-mapping>
于 2011-12-07T09:57:45.410 に答える