在 NHibernate 中查询未映射的列

Posted

技术标签:

【中文标题】在 NHibernate 中查询未映射的列【英文标题】:Query Unmapped Columns in NHibernate 【发布时间】:2009-03-18 06:32:20 【问题描述】:

我有一个使用 NHibernate 映射到表的类。问题是只有一些属性映射到表中的列。这很好,因为我们用于显示的唯一列是映射的,但是我想知道是否有任何方法可以查询表中未映射到我的类中的属性的其他列。

例如,我们有一个包含以下列的表格:

Customer
-----------
CustomerId
Name
DateCreated

我们有一个对象

public class Customer

    public virtual int CustomerId get;set;
    public virtual string name get;set;

namecustomerId 被映射但是DateCreated 不是因为我们从不在任何地方显示它。我们想在Customer 表中查询特定日期创建的客户。有没有办法做到这一点没有映射DateCreated?此外,最好使用标准 API 来执行此操作。

【问题讨论】:

【参考方案1】:

Ayende Rahien 发表了一篇文章,描述了在映射中指定 access="noop" 以指定仅查询属性。见NHibernate – query only properties。我自己没试过。

【讨论】:

我无法让它与 property 元素一起使用 - 有什么诀窍吗? @DaleBurrell 我也刚刚测试了这个,没有用。根据文档,noopproperty 元素上的access 属性无效(请参阅reference)。【参考方案2】:

使用普通的 SQL 查询是不可能的吗?我现在无法对其进行测试,但我想您可以查询未映射的字段,只要您的查询返回 Hibernate 可以映射到对象的内容。 (对不起,如果这已经被排除在一个选项中)

编辑:这似乎有效:

ISQLQuery query = session.CreateSQLQuery(
                "select c.* " +
                "from Customer c " +
                "where c.CreateDate > :CreateDate");

query.SetDateTime("CreateDate", new DateTime(2009, 3, 14));
query.AddEntity(typeof(Customer));

IList<Customer> results = query.List<Customer>();

【讨论】:

(我的列名略有不同) 这不是不可能的,但如果可能的话,我真的很希望能够使用标准 api。感谢您的帖子【参考方案3】:

对于 HQL/Criteria 查询,NHibernate 只能处理已映射的内容(尽管正如 Andy White 所指出的,原始 SQL 仍然是一个选项)。如果要使用 Criteria 查询,则必须映射列。

但是,NHibernate 不限于使用可公开访问的成员。因此,如果您想继续隐藏 CreateDate 字段,请声明一个私有(可能是只读的?)属性。或者,您可以跳过该属性并通过在映射中的属性元素上设置 access="field" 来指示 NHibernate 使用字段级别访问。

我知道您想在不映射字段的情况下执行此操作,但我认为这是不可能的(无需修改 NHibernate 源;)。尽管如此,如果您正在查询该字段,那么该字段与您的域有一些相关性,因此可能值得映射到其中,并且使用私有或受保护的成员,您可以将信息隐藏在适当的位置。

【讨论】:

我尝试使用私有属性,但在 C# 中不能拥有私有虚拟属性,并且 nhibernate 需要虚拟属性:(

以上是关于在 NHibernate 中查询未映射的列的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate3剖析:Mapping篇之集合映射基础:List映射

NHibernate:查询未映射实体时的意外行为

如何查询 NHibernate 的特定类型?

nhibernate教程--条件查询(Criteria Query)

NHibernate3剖析:Query篇之NHibernate.Linq增强查询

Nhibernate学习教程-- 第一个NHibernate程序