我有一个使用NHibernate映射到表的类。问题是只有部分属性映射到表中的列。这很好,因为我们用于显示的唯一列是映射的,但我想知道是否有任何方法可以查询表中未映射到我的类中的属性的其他列。
例如,我们有一个包含以下列的表:
Customer
-----------
CustomerId
Name
DateCreated
我们有一个对象
public class Customer
{
public virtual int CustomerId {get;set;}
public virtual string name {get;set;}
}
并且name
和customerId
已映射,但DateCreated
不是因为我们从未在任何地方展示过它。我们想查询Customer
表,查找由特定日期创建的客户。有没有办法做到这一点没有映射DateCreated
?此外,最好使用标准API来执行此操作。
答案 0 :(得分:11)
Ayende Rahien发表了一篇文章,其中描述了在映射中指定access="noop"
以指定仅查询属性。见NHibernate – query only properties。我自己没试过。
答案 1 :(得分: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>();
答案 2 :(得分:5)
使用HQL / Criteria查询,NHibernate只能处理已映射的内容(尽管原始SQL仍然是Andy White指出的选项)。如果要使用Criteria查询,则必须映射列。
但是,NHibernate不限于使用可公开访问的成员。因此,如果要继续隐藏CreateDate
字段,请声明私有(可能是只读?)属性。或者,您可以跳过该属性并通过在映射中的property元素上设置access="field"
来指示NHibernate使用字段级访问。
我知道你想在没有映射字段的情况下这样做,但我认为这是不可能的(不修改NHibernate源代码;)。尽管如此,如果您正在查询该字段,那么该字段与您的域有一定的相关性,因此可能应该映射到它,并且对于私有或受保护的成员,您可以保持信息隐藏到位。