问题标签 [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.

0 投票
0 回答
1737 浏览

nhibernate - Nhibernate - QueryOver JoinAlias 没有关系映射

我必须加入两个表,但这些字段没有。有可能做到吗?

例如

TableA (ID, MachineID, EquipmentID)

Machine (MachineID, Description)

有一个映射TableA.MachineID => Machine.MachineID。我可以为此使用 Join 并且没有问题。

现在我需要加入TableA.EquipmentID => Machine.MachineID。是否可以在没有映射字段的情况下执行此操作?

0 投票
1 回答
4081 浏览

nhibernate - 如何从 NHibernate 中的子查询中获取值?

我目前正在构建一个留言板,我需要在其中输出线程中的消息数量。

  • ID
  • 姓名
  • 消息计数

在普通 SQL 中,它看起来像这样,但我找不到任何关于如何制作inline select.

我只找到了有关如何使用分离查询限制结果集的示例,而不是如何从中选择实际值的示例。

如何使用 NHibernate 进行内联选择?我更喜欢使用 ICriteria 而不是 HQL。

编辑:我简化了我过于复杂的问题,使其更容易理解。

0 投票
1 回答
5044 浏览

c# - 如何使用 NHibernate 获取多个层次的对象?

我有一个案例,我需要从数据库中加载大约 10 000 个对象。数据模型是这样的:

这意味着我想根据一些查询从数据库中查询一个 SimulationObjects 列表,以及它的所有属性(引用)和子项。

收藏数量如下:

  1. SimulationObject - ca 6000 - 1200,取决于“where”中的参数
  2. SimulationObject.Results - 大约 5 到 40 个项目
  3. SimulationObject.Results.Items - 大约 0 到 2 个项目
  4. SimulationObject.PreviewData - 大约 0 到 2 个项目
  5. SimulationObject.PreviewData.Items - 大约 1 到 3 个项目

通常,我会这样做:

但是,我还需要获取“PreviewData”项目,因为这会在我的查询中创建一个笛卡尔积(意味着 PreviewDataAndSubItemsCount x ResultsAndSubItemsCount 返回的行数),这是非常无效的。此外,由于我需要加载大量 SumulationObjects(如前所述大约 10000 个),我不能进行延迟加载(10000 个查询......而且还有其他困难,所以这甚至不是考虑的替代方案)。

那么有哪些选择呢?您将使用什么策略将复杂对象图加载到内存中?

谢谢。

0 投票
0 回答
300 浏览

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 的角度“更改”查询,因此它缓存每个单独的“用户名”。

我知道,这有点难看,我对此并不满意。 有人知道任何替代方法吗?

提前致谢。

0 投票
2 回答
1258 浏览

nhibernate - NHibernate FetchMode 笛卡尔积

在我的对象图中, VendorServiceRateChange 有一个延迟加载的属性IList<VendorService>VendorServiceList ,而 VendorService 有一个延迟加载的属性IList<ClientService>

当我运行以下代码时,我在 VendorServiceList 和 ClientServiceList 之间得到一个笛卡尔积。

有没有办法使用 Criteria 或 DetachedCriteria 来构造这个查询,这不会导致笛卡尔积作为我的 VendorServiceList?我不想诉诸于注释掉“VendorServiceList.ClientServices”上的获取并在初始查询返回后使用 Initialize 调用循环。

提前致谢。

0 投票
1 回答
179 浏览

performance - NHibernate 排序性能

我在排序的查询上遇到了一些负面的表现。

这是 NHibernate 生成和呈现查询的方式:

粗体部分(在 ** 符号内)正在获取所有结果并将它们按顺序排列 - 这需要时间。有什么办法可以让这个查询更有效率吗?我只是想让排序和分页成为可能,而不必产生太多开销。

我正在使用 NHibernate 2.1。未来版本中与我的问题相关的任何改进?

最好的问候, 马蒂亚斯

0 投票
1 回答
244 浏览

nhibernate - NHibernate 投影元素的集合

我想选择给定经理未完成的所有请求。一个经理可以有多个团队。

我根据权限编写应用各种限制的查询,并更改查询以提供行数、存在检查、子查询等。

该组合使用 QueryOver,尽管使用 ICriteria 代替也是可以接受的。

给定以下课程;

这是我正在尝试的当前查询(不起作用)。

选择用户的 HQL 将是:

但我不想使用 HQL,因为我不能再将它与基于权限的其他限制组合起来。我也无法将其与其他查询组合以将其转换为行计数/存在检查等。

0 投票
0 回答
1041 浏览

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。

谢谢!

0 投票
1 回答
1576 浏览

nhibernate - 在 NHibernate 中加载没有重复的多级集合

我的问题与这个问题非常相似(没有真正回答):Nhibernate: distinct results in second level Collection

我有这个对象模型:

它们是一对多的关系。EntityB 和 C没有对其父对象的对象引用。

我想通过执行以下三个 SQL 查询来完全加载集合,以避免笛卡尔连接:

这样,DAL 就拥有了正确填充对象的所有信息。但是由于 EntityB 不知道它的父级是谁,所以必须由 nHibernate 负责正确地填充集合。

能做到吗??


可以用笛卡尔积来解决这个问题,但它需要修改我的模型以提供一个集合设置器,并且在我看来,它可以作为 DAL 技术问题的补丁。

0 投票
2 回答
4903 浏览

hibernate - NHibernate - 使用期货获取

我有这个 Fluent NHibernate 映射:

总结一下:

  1. 损失有许多付款、准备金和状态
  2. 付款有一个储备

我正在尝试获取具有以下约束的损失及其付款和准备金(但不是状态):

  1. 仅获取至少具有“status.Status not in (1,2,7)”状态的损失。
  2. 仅获取“loss.Payment.Type = 2 and loss.Payment.Reserve.Status != 4)”的 Loss.Payments
  3. 仅在 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,我对此没有任何问题。

谢谢!