我有一个使用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执行此操作.
Ayende Rahien发表了一篇文章,描述access="noop"
了在映射中指定指定仅查询属性.请参阅NHibernate - 仅查询属性.我自己没试过.
是不是使用普通的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)); IListresults = query.List ();
使用HQL/Criteria查询,NHibernate只能处理已映射的内容(尽管原始SQL仍然是Andy White指出的选项).如果要使用Criteria查询,则必须映射列.
但是,NHibernate不仅限于使用可公开访问的成员.所以,如果你想继续隐藏CreateDate
字段,请声明一个私有(也许是只读?)属性.或者,您可以跳过该属性并通过设置access="field"
映射中的property元素来指示NHibernate使用字段级访问.
我知道你想在没有映射字段的情况下这样做,但我认为这是不可能的(不修改NHibernate源代码;).尽管如此,如果您要查询该字段,那么该字段与您的域有一些相关性,因此可能值得映射到它,并且对于私有或受保护的成员,您可以保持信息隐藏到位.