gpt4 book ai didi

Nhibernate:二级集合中的不同结果

转载 作者:行者123 更新时间:2023-12-04 01:44:22 25 4
gpt4 key购买 nike

我有一个这样的对象模型:

   class EntityA
{
...
IList<EntityB> BList;
...
}

class EntityB
{
...
IList<EntityC> CList;
}

我必须获取所有集合(EntityA 中的 Blist 和 EntityB 中的 CList),因为如果它们都需要进行一些操作,如果我不急于加载它们,我将遇到选择 n+1 的问题。所以查询是这样的:

  select a from EntityA a left join fetch a.BList b left join fetch b.CList c

我遇到此查询的第一个问题是从数据库返回重复项,我有 EntityA 重复项,因为使用 BList 进行左连接提取。快速阅读 hibernate 文档并找到一些解决方案,首先我尝试了 distinct 关键字,除了在某些情况下,它可能不会复制 SQL distinct 关键字,也许这是其中一种情况,因为我有一个 SQL 错误说我无法选择不同的文本列(EntityA 表中的 [Observations] 列)。所以我使用了其他解决方案之一:

  query.SetResultTransformer(new DistinctRootEntityResultTransformer());

这很好用。但是操作的结果仍然没有通过测试。我进一步检查,发现现在有 EntityB 的重复项,因为与 CList 的左连接提取。

问题是,我如何在二级集合中使用 distinct?我进行了搜索,但我只找到了根实体的直接子集合的解决方案,但从未找到二级子集合的解决方案...

谢谢你的时间

最佳答案

您无法以简单的方式完成您想要的。我相信是 C 的 left join fetch 导致了重复。生成的查询是这样的:

select a 
left join a.b b
left join b.c c

数据库返回的行将是这样的:

1: a1 | b1 | c1
2: a1 | b1 | c2
3: a1 | b2 | c3
4: a1 | b2 | c4
...

尽管您已经过滤了根实体重复项(A),但由于 C 上的外部连接,数据库需要返回 B 的重复条目> 每个 C 条目的表。解决此问题的一种简单方法是通过实用程序集合过滤项目。根据您的实体要求,您还可以使用 HashSet,以便它自动过滤掉它们。

关于Nhibernate:二级集合中的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2217808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com