使用条件生成器在 fetch API 上发现重复记录

问题描述 投票:0回答:1

在获取父对象数据的 API 调用中使用条件生成器时,我遇到了获取重复记录的问题。

场景获取所有parent_obj值,按child_obj.name和parent_obj.description排序

查询1:

select parent_obj.id, .. 
from parent_obj 
inner join child_obj on parent_obj.id = child_obj.id 
where 1=1 
group by parent_obj.id, child_obj.name 
order by child_obj.name asc, parent_obj.description asc
limit 15 offset 15;

查询2:

select parent_obj.id, .. 
from parent_obj 
inner join child_obj on parent_obj.id = child_obj.id 
where 1=1 
group by parent_obj.id, child_obj.name 
order by child_obj.name asc, parent_obj.description asc
limit 15 offset 30;

Query1 返回中,值包含 id 的 15 条记录为 16、17 到 30。下一个 Query2 返回,接下来的 15 条记录,但记录包含 重复值,如 16 和 17 在列表中。

注意:如果我从查询中删除

order by
,我可以从parent_obj 中获取不同的值。

获取parent_obj.id的数据库结果:

查询1:

id1_2_ |      name       | description  
--------+-----------------+--------------
   1638 | Adidas          | Nvbnbvn
   1624 | Adidas          | Nvbnbvn
   1623 | Adidas          | Nvbnbvn at
   1636 | Adidas          | Sddsfdsfdsfd
   1647 | Adidas          | Sdfsdf
   1504 | Adidas          | Sdfsdv
   1508 | Adidas          | Shirt
   1661 | Adidas          | Trainers
   1537 | Adidas          | Trainers
   1646 | Adidas          | Ttdhd
   1500 | Adidas          | Yellow wear
   1651 | Avec les filles | Hgfhgjyg
   1657 | BUFFALO         | Hmgmhgjjh
   1652 | BUFFALO         | Hmgmhgjjh
   1656 | BUFFALO         | Hmgmhgjjh
(15 rows)

查询2:

 id1_2_ |   name   |     description      
--------+----------+----------------------
   1655 | BUFFALO  | Hmgmhgjjh
   1654 | BUFFALO  | Hmgmhgjjh
   1652 | BUFFALO  | Hmgmhgjjh
   1656 | BUFFALO  | Hmgmhgjjh
    484 | BURBERRY | Classic Camel
    483 | BURBERRY |  Red Check Scarf
    542 | CASTAÑER | Lurex Frayed Wedges
    504 | Chanel   | Polarized Sunglasses
    533 | CHLOÉ    | Faye Shoulder Bag
    534 | CHLOÉ    | Guipure Dress
    535 | CHLOÉ    | Rubie Sunglasses
    536 | CHLOÉ    | Sonnie Sneaker
    537 | CHLOÉ    | Susanna Boots
   1373 | CLUSE    | La Boheme Mesh
    469 | DIOR     | Dior Color Quake 1
(15 rows)

以上结果包含 1652 和 1656 的 id,它们具有相同的名称和相同的描述。

我该如何解决这个问题?

postgresql spring-data-jpa pagination
1个回答
0
投票

问题是您没有在排序中包含所有分组依据列。 因此,您得到的行无法通过排序来区分,即它们各自的顺序取决于数据库选择的访问路径并且本质上是随机的。

这会导致行包含在多个页面中,并且可能根本不包含其他行。

为了解决此问题,请将 group by 子句的所有列都显示在 order by 子句中,例如添加末尾未包含的列。

© www.soinside.com 2019 - 2024. All rights reserved.