2

エンティティの派生フィールドに制限を追加することは可能ですか?持続しないもの?たとえば、これが私のエンティティである場合:

public class Employee 
{
    public long Id { get; set; }
    public string Forename { get; set; }
    public string Surname {get; set; }
    public string FullName { get { return Forename + " " + Surname; }}
}

これがマッピングです。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               namespace="Domain.Entities"
               assembly="Domain">
  <class name="Employee" table="`Employee`">
    <id name="Id" column="Id" type="long">
      <generator class="identity"/>
    </id>
    <property name="Forename"/>
    <property name="Surname"/>
  </class>
</hibernate-mapping>

そしてこれは私の質問です:

public Employee GetByFullName(string fullName)
{
    return _session
        .CreateCriteria<Employee>
        .Add(Restrictions.Eq("FullName", fullName))
        .List<Employee>();
}

自分でクエリを作成できるという事実は無視してください。これは簡単な例です。これは、はるかに複雑なシナリオで役立ちます。

4

2 に答える 2

4

基本的に、SQLを使用して派生フィールドを複製できるかどうかによって異なります(したがって、基本的には実行できますが、実用性は異なります)。あなたの例では、次のようにFullnameプロパティをマップする必要があります。

<property name="Fullname" formula="Forename + ' ' + Surname"/>

次に、NHibernateが文句を言うのを防ぐには、フルネームに空のセッターを定義する必要があります。

public virtual string Fullname {
    get { return Forename + " " + Surname; }
    set { } // do nothing
}

次に、フルネームをクエリできるようになり、NHibernateは数式をSQLに正しく挿入します。

于 2012-10-01T15:03:18.073 に答える
1

いいえ。Hibernate/NHibernateのクエリは常にSQLに変換されます。フィールドがデータベースにない場合、クエリを実行することはできません。

于 2012-10-01T13:52:03.483 に答える