我可以在NHibernate中查询派生字段吗?

时间:2012-10-01 13:48:03

标签: hibernate nhibernate nhibernate-mapping hibernate-mapping

是否可以在实体中为派生字段添加限制,即。一个不坚持?例如,如果这是我的实体:

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>();
}

请忽略我自己可以编写查询的事实,这是一个简单的示例来演示。这在更复杂的场景中非常有用。

2 个答案:

答案 0 :(得分:4)

这取决于,基本上如果你可以用SQL复制派生字段然后就可以完成(所以基本上它可以完成,但它的实用性各不相同)。在您的示例中,您需要映射Fullname属性,如:

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

然后停止NHibernate抱怨你需要为Fullname定义一个空的setter:

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

然后你就可以查询Fullname了,NHibernate会正确地将公式插入到sql中。

答案 1 :(得分:1)

没有。 Hibernate / NHibernate中的查询总是转换为SQL。如果该字段不在数据库中,则无法查询该字段。