在HQL执行期间将lazy设置为true

时间:2009-05-15 06:42:14

标签: hql lazy-evaluation hbm

在我们的应用程序中,我们根据应用程序的需要将各种对象设置为lazy false。但是,在其中一个用例中,我们要忽略HBM文件中的所有延迟设置,并且只获取目标对象。

所以问题是:有没有办法在HQL中指定只获取目标对象而不考虑HBM设置?

〜斯里兰卡

2 个答案:

答案 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