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

发布于 2024-07-21 07:18:21 字数 159 浏览 5 评论 0原文

在我们的应用程序中,我们根据应用程序的需要将各种对象设置为lazy false。 然而,在其中一个用例中,我们希望忽略 HBM 文件中的所有惰性设置,并仅获取目标对象。

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

〜斯里

In our application, we have various objects set to lazy false based on the application needs. However, in one of the use case we want to ignore all the lazy settings within the HBM files, and get ONLY the target object.

So the question is: is there a way to specify in the HQL to fetch ONLY the target object irrespective of the HBM settings?

~Sri

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

執念 2024-07-28 07:18:21

您可以在 Criteria 上使用 setFetchMode 之前执行以覆盖 HBM 文件设置

you can use setFetchMode on the Criteria before it is executed to override the HBM file setting

与往事干杯 2024-07-28 07:18:21

抱歉,不确定您是否理解您的问题。

如果您必须为特定类实现它,则可以使用 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

Sorry, not sure if you understood your question.

If you have to implement it for a specific class, you can just use SetFetchMode.

var query = session.CreateCriteria(typeof(MyClass));
query.SetFetchMode("PropertyA", FetchMode.Select);
query.SetFetchMode("PropertyB", FetchMode.Select);

Note: for many-to-one references the entity class itself must be mapped with lazy=true. If not, NHibernate doesn't even create a proxy class for it.


This is the answer if you want to lazy load the type in a generic, type-independent way:

You could find them with the metadata and add fetch modes to a criteria

I didn't try it, but I would start with the following code:

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);
  }
}

This doesn't include collections. They are probably found with factory.GetCollectionMetadata(roleName), but you need to find out the roleName.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文