8

我有一个使用 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 来执行此操作。

4

3 回答 3

11

Ayende Rahien 发布了一篇文章,描述access="noop"了在映射中指定以指定仅查询属性。请参阅NHibernate – 仅查询属性。我自己没有尝试过。

于 2009-07-11T05:12:32.167 回答
5

使用普通的 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>();
于 2009-03-18T06:39:36.923 回答
5

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

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

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

于 2009-03-18T13:36:23.097 回答