gpt4 book ai didi

java - 具有偏移和限制的 0..n 结果转换会产生不准确的结果

转载 作者:行者123 更新时间:2023-12-02 06:16:57 33 4
gpt4 key购买 nike

我已经搜索了正确的答案,但不幸的是没有找到 QueryDsl SQL 模块的任何工作解决方案。我正在尝试使用自定义属性上的左连接来获取具有 0..n 关系的简单实体:

class Parent {
private Long id;
private String uuid;
private Set<Child> children;
}

class Child {
private Long id;
private String uuidRef;
}

为了能够填充 dto,我将结果转换如下:

queryFactory().from(qParent)
.leftJoin(qChild).on(qParent.uuid.eq(qChild.uuidRef))
.where(...)
.transform(GroupBy.groupBy(qParent.id).list(parentQBean))

父行具有多个子关​​系。一切工作正常,除非我向分页 pupropses 的查询添加额外的限制和偏移量。假设我想要前 20 个结果,因此我添加 .offset(0).limit(20)。

在数据库中有 2 个父记录,每个记录有 2 个子行。转换/分组后,我只得到 18 行/对象。我知道这是由于 SQL 查询本身造成的,因为它返回左连接行作为单独的结果行,并且转换是在内存中完成的,但我想知道这是否可以在 SQL 模块上以某种方式处理。我不想使用 JPA,因为这是一个相当小的项目,只有很少的表,而且 JPA/Hibernate 会有点过大。 SQL 模块非常适合这个:)

将 QueryDsl SQL 4.2.1 与 PostgreSQL 11.2 结合使用

最佳答案

我想说 JPA 也不会“正确”处理这个问题,至少在尝试一次性获取 parent 及其 child 时不会。正如您已经注意到的,问题在于偏移和限制应用于结果,如果父级有多个子级,则连接可能会导致加载更少的父级(或者甚至只有一个父级仅加载其子级的一部分,如果有)许多)。因此,您必须将偏移量和限制应用于代表每行父级的内容。

你可以尝试这样的事情(我不知道 QueryDsl,所以我只使用伪 SQL):

select ... from parent p join children c on ...
where p.id in ( select distinct id from parent order by whatever offset x limit y )

因此,您需要做的是确定子查询中 20 个父项的 id,然后加载这些父项及其子项,这可能会导致超过 20 个结果行(如果 2 个父项有 2 个,则在您的情况下为 22 行) child ,其他 18 人最多只有 1 个)。

关于java - 具有偏移和限制的 0..n 结果转换会产生不准确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55864089/

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