问题标签 [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.
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。
使用我上面指定的设计,有没有我想不到的方法来做到这一点?还是我的设计需要重新思考?
谢谢
大卫
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 自动选择。
但我仍然不明白它是如何工作的。
- 为什么是 11 批装载机?
- 为什么批处理加载器可以初始化:20、10、9、8、7、6、5、4、3、2、1 个代理?
如果有人可以提出一步一步的算法...... :)
nhibernate - Nhibernate - 分页和急切加载实体
我有两个实体,一个团队和一个员工。
我想要一份拥有热切的团队的员工名单。该列表必须分页。
为什么这不起作用?
SQL 结果:
java - HIbernate fetch join 发出额外的 sql 语句
考虑以下具有两个 ManyToOne 引用的 Parent 类。
我正在使用以下 hql 查询来加载父实例:
这总是会导致 hibernate 发出单独的 sql 语句来加载 childInstance1 行,即使它执行了 fetch 连接。
感谢您在避免额外的 sql 语句方面提供的任何帮助。
.net - 忽略 SetFetchMode 调用
在以下查询中,Criteria API 中的 SetFetchMode 调用存在问题:
我的课程:
和映射
但是在获得用户列表后,Nhibernate 再次查询数据库以再次为每个用户获取公司集合。NHibernate 只是忽略了 SetFetchMode 的调用,因为我试图写这样的东西:
Nhibernate 不会抛出任何异常。
我也尝试在映射中将 Lazy 设置为 false,但它也没有帮助。不知道如何解决它,有人可以
之后,Nhibernate 加载了带有实体的集合。但是他仍然忽略了SetFetchMode,我可以在那里写任何东西。
entity-framework - 实体框架将 PreserveChanges 设置为默认 MergeOption
在 ASP.net mvc 2 项目中,有没有办法将所有实体类型的默认 MergeOption 设置为 PreserveChanges?
目前我有一个巨大的子集,可以设置所有实体类型mergeOption。
谢谢
c# - Linq to NHibernate ThenFetch 多个属性
我有这个对象图:
现在我正在查询我将返回一个A
s 列表并且我需要它们的所有B
s、C
s、X
s 和Y
s。我还将按 B 将它们分组到查找中。
需要注意的几点:
- 这是一个需要返回所有数据的报告 - 无限的结果不是问题。
- 我正在通过 using 进行分组,
ToLookup
因为group by
当您需要所有实际值时 using 似乎更复杂 - 您需要查询数据库中的组,然后查询它们的实际值。
我的问题是如何正确指定获取策略。我这样做的方式是我发现它运行的唯一方式(已获取所有 bx 和值) - 但它产生的 SQL 似乎是错误的:
正如您所看到的,它获得了a.b
3 次的值 -b1
以及b3
获取和b6
where 子句。
- 我认为这对数据库性能有负面影响——我说得对吗?
- 有没有办法修改我的
.Fetch
调用,使其只获取a.b
一次? - 这是解决我的问题的好方法吗?
grails - Grails 自动关系获取
可以在 GORM / Grails 中进行自动关系获取吗?
然后使用这种关系,如:
java - 我可以从 DatabaseMetaData 查询更改结果集中的获取模式吗?
我正在使用 DatabaseMetaData 实例检查数据库。我获得了数据库中表的所有信息,并毫无问题地迭代了所有结果集。
在迭代结束时,我想回到 ResultSet 的开头,所以我调用 beforeFirst() 方法,然后调用 next() 来获取 ResultSet 的第一个元素。这是我的代码:
我已经得到了所有的结果,但是我得到了这个例外:
'直到这里一切看起来都很正常。根据我的连接(到 MSAcsess 的 JDBC-OBDC),我的 ResultSet 的获取模式是 ONLY_FORWARD,所以我尝试使用
为了允许保留模式......但它不允许我。新例外:
是否可以将获取模式设置为来自 DatabaseMetaData 的结果集?我该怎么做??
谢谢。
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 库的函数或注册我自己的扩展方法来满足他们的解析器。
时髦。