2

是否可以向实体中的派生字段添加限制,即,一个不坚持?例如,如果这是我的实体:我可以查询NHibernate中的派生字段吗?

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

请忽略的事实,我可以写查询我自己,这是一个微不足道的例子来演示。这在更复杂的情况下会很有用。

+0

你也可以做这样的事情:http://stackoverflow.com/questions/6709463/fuzzy-search-on-a-concatenated-full-name-using-nhibernate –

回答

4

这取决于,基本上如果你可以用SQL复制派生字段,那么它可以完成(基本上可以完成,但它的实用性会有所不同)。在您的例子中,你将需要映射你的全名属性,如:

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

然后从抱怨阻止NHibernate的,你需要定义全名空二传手:

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

然后,你就可以查询全名和NHibernate将公式插入到SQL正确。

+0

会需要一个名为'全名'在这个数据库表中? –

+0

不,NHibernate将使用全名替换您在映射中定义的公式,当它发出SQL查询时 –

+0

我的问题是一个简单的例子,用来说明更多先进的scaenarios,例如遍历关系并具有复杂算法的派生字段。虽然这不适用于所有情况,但它的确回答了这个问题。 –

1

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

相关问题