在我们的应用程序中,我们根据应用程序需要将各种对象设置为lazy false。然而,在一个用例中,我们希望忽略 HBM 文件中的所有惰性设置,只获取目标对象。
所以问题是:有没有办法在 HQL 中指定只获取目标对象而不管 HBM 设置如何?
~斯里兰卡
在我们的应用程序中,我们根据应用程序需要将各种对象设置为lazy false。然而,在一个用例中,我们希望忽略 HBM 文件中的所有惰性设置,只获取目标对象。
所以问题是:有没有办法在 HQL 中指定只获取目标对象而不管 HBM 设置如何?
~斯里兰卡
您可以在执行之前在 Criteria 上使用setFetchMode来覆盖 HBM 文件设置
抱歉,不确定您是否理解您的问题。
如果您必须为特定类实现它,则可以使用 SetFetchMode。
var query = session.CreateCriteria(typeof(MyClass));
query.SetFetchMode("PropertyA", FetchMode.Select);
query.SetFetchMode("PropertyB", FetchMode.Select);
注意:对于多对一引用,实体类本身必须映射为lazy=true。如果没有,NHibernate 甚至不会为它创建代理类。
如果您想以通用的、与类型无关的方式延迟加载类型,这就是答案:
您可以使用元数据找到它们并将获取模式添加到条件
我没有尝试过,但我将从以下代码开始:
var meta = sessionfactory.GetClassMetaData(typeof(MyClass));
var query = session.CreateCriteria(typeof(MyClass));
for(int index = 0; index < meta.PropertyType.Length; index++)
{
if (meta.PropertyType[index] == NHibernateUtil.Entity)
{
query.SetFetchMode(meta.PropertyNames[index], FetchMode.Select);
}
}
这不包括集合。它们可能与 一起找到factory.GetCollectionMetadata(roleName)
,但您需要找出roleName
.