在我们的应用程序中,我们根据应用程序的需要将各种对象设置为lazy false。但是,在其中一个用例中,我们要忽略HBM文件中的所有延迟设置,并且只获取目标对象。
所以问题是:有没有办法在HQL中指定只获取目标对象而不考虑HBM设置?
〜斯里兰卡
答案 0 :(得分:1)
您可以在执行标准之前使用setFetchMode来覆盖HBM文件设置
答案 1 :(得分:0)
抱歉,不确定您是否理解了您的问题。
如果必须为特定类实现它,则可以使用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
。