【问题标题】:Can I query a derived field in NHibernate?我可以在 NHibernate 中查询派生字段吗?
【发布时间】:2012-10-01 13:48:02
【问题描述】:

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

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

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

【问题讨论】:

标签: hibernate nhibernate nhibernate-mapping hibernate-mapping


【解决方案1】:

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

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

然后要阻止 NHibernate 抱怨,您需要为 Fullname 定义一个空的 setter:

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

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

【讨论】:

  • 数据库表中是否需要一个名为“全名”的字段?
  • 不,NHibernate 会在发出 SQL 查询时将您对 Fullname 的使用替换为映射中定义的公式
  • 我的问题是一个简单的例子来说明更高级的场景,例如遍历关系并具有复杂算法的派生字段。虽然这并不适用于所有情况,但它确实回答了手头的问题。
  • 如果您的情况很复杂,您可以定义一个 SQL 函数来复制它,它可以遍历关系/连接并具有复杂的算法。如果您使用的是 SQL Server,则可以链接到 .NET 程序集以定义更复杂的函数并在属性的公式映射中调用该函数。
【解决方案2】:

没有。 Hibernate / NHibernate 中的查询总是被翻译成 SQL。如果该字段不在数据库中,则无法查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    相关资源
    最近更新 更多