我正在使用NHibernate将一些对象加载到我的ASP.NET MVC应用程序中。
例如,提交是由用户提交的,我想显示用户的用户名(但只显示用户名),如下所示:
<%= Html.Encode(item.User.UserName) %>
当我使用NHibernate加载提交时,用户从数据库延迟加载,这意味着只有在我调用上面的代码行时才会生成并执行实际的SQL查询(加载用户信息)是我想要的。)
问题是SQL查询还会选择有关用户的其他信息,例如密码,电子邮件等。显然不需要这些信息并将其丢弃。
SQL查询如下所示:
SELECT id, username, password, email FROM User WHERE Id = 1;
我得出结论,NHibernate只对我映射到数据库中的表的其他对象进行延迟加载引用。它似乎没有延迟加载基本的原始类型,如字符串,整数等。
我能这样做吗?当上面的代码被选中时,我希望SQL查询看起来像这样:
SELECT username FROM User WHERE Id = 1;
这可能吗?怎么样?
答案 0 :(得分:1)
您是否有理由不想加载完整的对象?除极少数情况外,没有真正的性能差异。
我可以理解不想将密码加载到内存中,尽管它应该加密,并且可能不应该在您的域模型中。在我的情况下,我会做的是将User子类分为两个类,User和UserProfile(包含密码等),这样您在管理用户帐户时只能使用UserProfile对象。
答案 1 :(得分:0)
您需要使用resultTransformer将查询结果映射到您要存储它的对象(我理解的是您的普通用户DTO类,但是减去所有其他字段)
请查看http://docs.jboss.org/hibernate/stable/core/reference/en/html/querysql.html(其Hibernate,而不是NHibernate,但它仍应适用),具体见16.1.5节