问题标签 [fetching-strategy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1490 浏览

nhibernate - 如何通过外观层设置 NHibernate Linq 获取策略

我使用 NHibernate 进行数据访问,但通过外观层访问它。该层由存储库的接口以及对应于 ISession 对象的 IUnitOfWork 接口组成。

为了正确管理检索到的实体,存储库在其构造函数中传递了一个 IUnitOfWork,并且 IUnitOfWork 用于加载。

IUnitOfWork 包含一个名为 All 的属性,它将类的所有实体作为 IQueryable 检索(用于以后过滤)。因此,检索今年创建的所有实体的存储库方法可能如下所示:

注意:这不是这些接口和类的完整代码!只有与我的问题相关的代码。

IUnitOfWork 接口:

UnitOfWork 具体类:

IFooRepository 接口

FooRepository 具体类

我想添加功能来指定获取策略,以便可以急切地加载相关实体。假设 Foo 有一个对应于另一个实体 Bar 的属性:

映射文件指定 Bar 是延迟加载的,但在我的 ThisYearsFoos 存储库属性中,我想指定 Bar 应立即加载以避免 N+1 选择。

在 Linq to NHibernate 中,我们可以使用 Expand() 扩展方法指定预取。但是这个扩展方法属于NHibernateQueryable类型,而IUnitOfWork接口的GetList方法只知道IQueryable。

显然,我不希望 IUnitOfWork 接口知道 INHibernateQueryable,因为它应该不知道 NHibernate。

使用我上面指定的设计,有没有我想不到的方法来做到这一点?还是我的设计需要重新思考?

谢谢

大卫

0 投票
2 回答
2376 浏览

java - Hibernate 的批量获取算法是如何工作的?

我在“Manning - Java Persistence with Hibernate”中找到了对批处理获取算法的描述:

真正的批量抓取算法是什么?(...) 想象一下批量大小为 20,总共有 119 个必须分批加载的未初始化代理。在启动时,Hibernate 读取映射元数据并在内部创建 11 个批处理加载器。每个加载器都知道它可以初始化多少个代理:20、10、9、8、7、6、5、4、3、2、1。目标是最小化加载器创建的内存消耗,并创建足够的加载器,每个可以产生可能的批量提取。显然,另一个目标是尽量减少 SQL SELECT 的数量。为了初始化 119 个代理,Hibernate 执行了 7 个批次(您可能期望有 6 个,因为 6 x 20 > 119)。应用的批处理加载器是 5 次 20、1 次 10 和 1 次 9,由 Hibernate 自动选择。

但我仍然不明白它是如何工作的。

  1. 为什么是 11 批装载机?
  2. 为什么批处理加载器可以初始化:20、10、9、8、7、6、5、4、3、2、1 个代理?

如果有人可以提出一步一步的算法...... :)

0 投票
1 回答
493 浏览

nhibernate - Nhibernate - 分页和急切加载实体

我有两个实体,一个团队和一个员工。

我想要一份拥有热切的团队的员工名单。该列表必须分页。

为什么这不起作用?

SQL 结果:

0 投票
1 回答
1502 浏览

java - HIbernate fetch join 发出额外的 sql 语句

考虑以下具有两个 ManyToOne 引用的 Parent 类。

我正在使用以下 hql 查询来加载父实例:

这总是会导致 hibernate 发出单独的 sql 语句来加载 childInstance1 行,即使它执行了 fetch 连接。

感谢您在避免额外的 sql 语句方面提供的任何帮助。

0 投票
2 回答
1426 浏览

.net - 忽略 SetFetchMode 调用

在以下查询中,Criteria API 中的 SetFetchMode 调用存在问题:

我的课程:

和映射

但是在获得用户列表后,Nhibernate 再次查询数据库以再次为每个用户获取公司集合。NHibernate 只是忽略了 SetFetchMode 的调用,因为我试图写这样的东西:

Nhibernate 不会抛出任何异常。

我也尝试在映射中将 Lazy 设置为 false,但它也没有帮助。不知道如何解决它,有人可以

之后,Nhibernate 加载了带有实体的集合。但是他仍然忽略了SetFetchMode,我可以在那里写任何东西。

0 投票
2 回答
1394 浏览

entity-framework - 实体框架将 PreserveChanges 设置为默认 MergeOption

在 ASP.net mvc 2 项目中,有没有办法将所有实体类型的默认 MergeOption 设置为 PreserveChanges?

目前我有一个巨大的子集,可以设置所有实体类型mergeOption。

谢谢

0 投票
1 回答
5358 浏览

c# - Linq to NHibernate ThenFetch 多个属性

我有这个对象图:

现在我正在查询我将返回一个As 列表并且我需要它们的所有Bs、Cs、Xs 和Ys。我还将按 B 将它们分组到查找中。

需要注意的几点:

  1. 这是一个需要返回所有数据的报告 - 无限的结果不是问题。
  2. 我正在通过 using 进行分组,ToLookup因为group by当您需要所有实际值时 using 似乎更复杂 - 您需要查询数据库中的组,然后查询它们的实际值。

我的问题是如何正确指定获取策略。我这样做的方式是我发现它运行的唯一方式(已获取所有 bx 和值) - 但它产生的 SQL 似乎是错误的:

正如您所看到的,它获得了a.b3 次的值 -b1以及b3获取和b6where 子句。

  1. 我认为这对数据库性能有负面影响——我说得对吗?
  2. 有没有办法修改我的.Fetch调用,使其只获取a.b一次?
  3. 这是解决我的问题的好方法吗?
0 投票
2 回答
855 浏览

grails - Grails 自动关系获取

可以在 GORM / Grails 中进行自动关系获取吗?

然后使用这种关系,如:

0 投票
1 回答
2085 浏览

java - 我可以从 DatabaseMetaData 查询更改结果集中的获取模式吗?

我正在使用 DatabaseMetaData 实例检查数据库。我获得了数据库中表的所有信息,并毫无问题地迭代了所有结果集。

在迭代结束时,我想回到 ResultSet 的开头,所以我调用 beforeFirst() 方法,然后调用 next() 来获取 ResultSet 的第一个元素。这是我的代码:

我已经得到了所有的结果,但是我得到了这个例外:

'直到这里一切看起来都很正常。根据我的连接(到 MSAcsess 的 JDBC-OBDC),我的 ResultSet 的获取模式是 ONLY_FORWARD,所以我尝试使用

为了允许保留模式......但它不允许我。新例外:

是否可以将获取模式设置为来自 DatabaseMetaData 的结果集?我该怎么做??

谢谢。

0 投票
1 回答
827 浏览

entity-framework-4.1 - Entity Framework 4.1 和 NHibernate 的获取策略封装

我创建了一个项目来测试 NHibernate 3+ 与 Entity Framework 4.1,将其包装在存储库中,使其非常易于使用接口等进行测试。

我不想在存储库之外公开任何 ORM(我什至不公开 IQueryables)。一切都应该在该层中处理,直到我尝试以抽象方式处理获取,一切都很好。

Microsoft 添加预加载的实现在 Include 函数中使用魔术字符串 (yuck) 或 Linq 表达式 (yay)。它们的语法如下:

第一个只会加载关联的人。(parent) 第二个会加载关联公司和各个公司的联系方式。(父母和祖父母)。第三个将加载每个订单的所有关联订单、订单项和成本。

这是一个非常巧妙的实现。

NHibernate 使用稍微不同的方法。他们仍然使用 Linq 表达式,但是他们更多地使用了扩展方法(流利的方法)。

(我不确定第三行是否是正确的语法)

我可以将表达式列表封装在一个单独的类中,然后将这些表达式应用于该类中的 IQueryable。所以我需要做的是标准化 Microsoft 表达式语法,然后通过遍历表达式树并重建每个表达式将其转换为 NHibernate 的语法。

这是真正棘手的部分。我必须保持特定的操作顺序才能为 IQueryable 调用正确的函数(必须以 Fetch 或 FetchMany 开头,每个后续都是“ThenFetch”或“ThenFetchMany”),这使我无法使用内置的-在 ExpressionVisitor 类中。

编辑:我最终创建了一个表达式解析器,它将对集合进行任何级别的属性、集合和选择嵌套,并生成一个表达式数组。不幸的是,内置的 Fetch 扩展方法不将 LambdaExpression 作为参数。

我目前坚持的部分是无法使用 nHibernate 的内置 Fetch 定义。看起来我可能不得不直接点击 Remotion 库的函数或注册我自己的扩展方法来满足他们的解析器。

时髦。