问题标签 [nhibernate-criteria]
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 - QueryOver JoinAlias 没有关系映射
我必须加入两个表,但这些字段没有。有可能做到吗?
例如
TableA (ID, MachineID, EquipmentID)
Machine (MachineID, Description)
有一个映射TableA.MachineID => Machine.MachineID
。我可以为此使用 Join 并且没有问题。
现在我需要加入TableA.EquipmentID => Machine.MachineID
。是否可以在没有映射字段的情况下执行此操作?
nhibernate - 如何从 NHibernate 中的子查询中获取值?
我目前正在构建一个留言板,我需要在其中输出线程中的消息数量。
- ID
- 姓名
- 消息计数
在普通 SQL 中,它看起来像这样,但我找不到任何关于如何制作inline select
.
我只找到了有关如何使用分离查询限制结果集的示例,而不是如何从中选择实际值的示例。
如何使用 NHibernate 进行内联选择?我更喜欢使用 ICriteria 而不是 HQL。
编辑:我简化了我过于复杂的问题,使其更容易理解。
c# - 如何使用 NHibernate 获取多个层次的对象?
我有一个案例,我需要从数据库中加载大约 10 000 个对象。数据模型是这样的:
这意味着我想根据一些查询从数据库中查询一个 SimulationObjects 列表,以及它的所有属性(引用)和子项。
收藏数量如下:
- SimulationObject - ca 6000 - 1200,取决于“where”中的参数
- SimulationObject.Results - 大约 5 到 40 个项目
- SimulationObject.Results.Items - 大约 0 到 2 个项目
- SimulationObject.PreviewData - 大约 0 到 2 个项目
- SimulationObject.PreviewData.Items - 大约 1 到 3 个项目
通常,我会这样做:
但是,我还需要获取“PreviewData”项目,因为这会在我的查询中创建一个笛卡尔积(意味着 PreviewDataAndSubItemsCount x ResultsAndSubItemsCount 返回的行数),这是非常无效的。此外,由于我需要加载大量 SumulationObjects(如前所述大约 10000 个),我不能进行延迟加载(10000 个查询......而且还有其他困难,所以这甚至不是考虑的替代方案)。
那么有哪些选择呢?您将使用什么策略将复杂对象图加载到内存中?
谢谢。
fluent-nhibernate - 多用户环境中的 NHibernate QueryCache
对于我们的 Web 应用程序 (ASP.NET),我们使用 Fluent NHibernate (2.1.2) 和二级缓存,不仅用于实体,还用于查询(使用标准 API 生成查询)。我们使用 Session-Per-Request 模式和一个 SessionFactory 应用程序,因此缓存服务于所有 Nhibernate-Sessions。
问题:
我们必须在遗留数据库 (Oracle) 中的数据对象上为每个用户处理不同的“访问权限”——也就是说,视图限制了每个用户权限的返回数据。所以有这样的情况,例如,我们的条件使用完全相同的查询查询相同的视图,但返回不同的结果集,具体取决于用户权限。
现在,为了获得性能,提到的查询被缓存。但这给我们带来了问题,当用户 A 的操作首次触发查询时,它会缓存结果 ID,即用户 A 有权访问的 ID。不久之后,用户 B 的操作触发了相同的查询,然后 Nhibernate 从第一次调用(来自用户 A)中选择缓存的 ID,并尝试获取用户 B 没有访问权限的相应实体(或者可能不适合所有人)。我们正在使用事件侦听器检查权限,因此我们的应用程序在上述情况下会引发访问权限异常。
想法:
不缓存查询可能是针对此的一种选择。但是性能在我们的应用程序中显然是一个问题,因此非常希望缓存用户的查询。
我们甚至考虑过每个用户都有一个 SessionFactory,每个用户都有一个缓存,有点。但这显然对资源有影响,有点矫枉过正,老实说不是一个选择,因为有实体,必须由多个用户(想想一个用户组)访问和操作,创建“个人缓存”中的陈旧数据等问题。所以这是不行的。
什么是有效的解决方案?对于这种情况,是否有“最佳实践”之类的东西?
主意:
因为我昨天被困在这个问题上,看不到出路,所以我睡在上面,今天我想出了某种“黑客”。
由于 NHibernate 通过查询文本和参数(“子句”)缓存查询,我想到了一种方法,在查询的签名中“走私”与用户相关的东西,因此它会缓存每个用户的每个查询,但不会更改查询本身(关于查询结果)。
所以“创造力”引导我这样做(示例代码):
这一行:
.Add(Expression.Sql(string.Format("{0} = {0}", userName)))
导致 where 子句,它总是评估为 true,但从 Nhibernate 的角度“更改”查询,因此它缓存每个单独的“用户名”。
我知道,这有点难看,我对此并不满意。 有人知道任何替代方法吗?
提前致谢。
nhibernate - NHibernate FetchMode 笛卡尔积
在我的对象图中, VendorServiceRateChange 有一个延迟加载的属性IList<VendorService>
VendorServiceList ,而 VendorService 有一个延迟加载的属性IList<ClientService>
。
当我运行以下代码时,我在 VendorServiceList 和 ClientServiceList 之间得到一个笛卡尔积。
有没有办法使用 Criteria 或 DetachedCriteria 来构造这个查询,这不会导致笛卡尔积作为我的 VendorServiceList?我不想诉诸于注释掉“VendorServiceList.ClientServices”上的获取并在初始查询返回后使用 Initialize 调用循环。
提前致谢。
performance - NHibernate 排序性能
我在排序的查询上遇到了一些负面的表现。
这是 NHibernate 生成和呈现查询的方式:
粗体部分(在 ** 符号内)正在获取所有结果并将它们按顺序排列 - 这需要时间。有什么办法可以让这个查询更有效率吗?我只是想让排序和分页成为可能,而不必产生太多开销。
我正在使用 NHibernate 2.1。未来版本中与我的问题相关的任何改进?
最好的问候, 马蒂亚斯
nhibernate - NHibernate 投影元素的集合
我想选择给定经理未完成的所有请求。一个经理可以有多个团队。
我根据权限编写应用各种限制的查询,并更改查询以提供行数、存在检查、子查询等。
该组合使用 QueryOver,尽管使用 ICriteria 代替也是可以接受的。
给定以下课程;
这是我正在尝试的当前查询(不起作用)。
选择用户的 HQL 将是:
但我不想使用 HQL,因为我不能再将它与基于权限的其他限制组合起来。我也无法将其与其他查询组合以将其转换为行计数/存在检查等。
nhibernate - nHibernate:将实体名称与 QueryOver 和 CreateCriteria 一起使用
我有两个 hbm.xml 映射文件。除了类表和类实体名称属性之外,它们是相同的。它们应该填充相同的实体。它们分别有 entity-name= Alpha 和 Beta,table= PersonAlpha 和 PersonBeta。
我尝试使用 QueryOver 和 Criteria 来填充实体 Person:
作为我对实体名称的引用,我认为 nHibernate 会知道要使用哪个映射文件,但根据 Profiler,上述每个语句都会针对 PersonAlpha 和 PersonBeta 表生成 SQL。为什么是这样?
我使用版本 3.2.0 2001 og nHibernate。
谢谢!
nhibernate - 在 NHibernate 中加载没有重复的多级集合
我的问题与这个问题非常相似(没有真正回答):Nhibernate: distinct results in second level Collection
我有这个对象模型:
它们是一对多的关系。EntityB 和 C没有对其父对象的对象引用。
我想通过执行以下三个 SQL 查询来完全加载集合,以避免笛卡尔连接:
这样,DAL 就拥有了正确填充对象的所有信息。但是由于 EntityB 不知道它的父级是谁,所以必须由 nHibernate 负责正确地填充集合。
能做到吗??
我可以用笛卡尔积来解决这个问题,但它需要修改我的模型以提供一个集合设置器,并且在我看来,它可以作为 DAL 技术问题的补丁。
hibernate - NHibernate - 使用期货获取
我有这个 Fluent NHibernate 映射:
总结一下:
- 损失有许多付款、准备金和状态
- 付款有一个储备
我正在尝试获取具有以下约束的损失及其付款和准备金(但不是状态):
- 仅获取至少具有“status.Status not in (1,2,7)”状态的损失。
- 仅获取“loss.Payment.Type = 2 and loss.Payment.Reserve.Status != 4)”的 Loss.Payments
- 仅在 Reserve.Status != 3 处获取 Loss.Reserves
当我试图获取 2 个并行关系时,我必须使用多查询或期货来避免笛卡尔积(对吗?),如下所述:http: //ayende.com/blog/4367/eagerly-loading-entity-associations-高效地休眠
我想出了这个查询(在 HQL 中):
但是,执行此查询时,出现错误:NHibernate.HibernateException: Failed to execute multi query[..SQL query]---> System.ArgumentException: The value "System.Object[]" is not of type "Entities .Loss”并且不能在这个通用集合中使用。
任何线索我在这里做错了什么?
当我删除状态约束时,查询有效:
但是,结果不是我想要的(我需要那个约束)。
有什么建议吗?
哦,使用 HQL 不是“必须的”,如果可以使用 Linq 或 QueryOver,我对此没有任何问题。
谢谢!