如何消除querydsl中的数据重复?

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

查询

select
        book1.id as col_0_0_,
        book1.title as col_2_0_,
        images1_.id as col_5_0_,
        images1_.filesize as col_9_0_ 
    from
        book book1 
    left outer join
        image images1_ 
            on book1.id=images1_.book_id 
    order by
        book1.id desc limit ? offset ?

查询DSL

return jpaQueryFactory
                .select(book)
                .from(book)
                .leftJoin(book.images, image)
                .orderBy(book.id.desc())
                .offset((long)(pageNo-1) * pageSize)
                .limit(pageSize)
                .transform(
                        groupBy(book.id).list(
                                Projections.constructor(Book.class, book.id, book.title, 
                                list(Projections.constructor(Image.class, image.id, book.id, image.filesize))
                        )
                ));

书籍和图像具有 1:N 的关系 我想在使用变换和投影时发送单个查询。 如果你编写如下查询,由于Leftjoin,会出现数据重复。这种情况我该怎么办?

要求

使用投影和变换 必须用一条sql完成

我尝试了groupby或distinct。 但是,如果以这种方式删除重复项,则无法通过转换检索图像列表。

该sql的问题是:

  1. 直到 orderby 子句,才会出现具有重复 book_ids 的行。
  2. 如果执行转换,重复行将被删除,但分页不会按预期执行。这是因为包含重复项的行数和删除重复项后出现的行数不同。
sql jpa dsl
1个回答
0
投票

在处理查询中的一对多关系和分页时,您似乎遇到了一个常见问题。

SELECT
    book1.id AS col_0_0_,
    book1.title AS col_2_0_,
    images1_.id AS col_5_0_,
    images1_.filesize AS col_9_0_
FROM
    book book1
LEFT OUTER JOIN (
    SELECT
        id,
        book_id,
        filesize,
        ROW_NUMBER() OVER (PARTITION BY book_id ORDER BY id) AS row_num
    FROM
        image
) images1_ ON book1.id = images1_.book_id AND images1_.row_num = 1
ORDER BY
    book1.id DESC
LIMIT ? OFFSET ?

现在,当您将这个修改后的查询与现有转换逻辑一起使用时,您应该获得带有分页的所需结果,并且不会因一对多关系而导致重复。

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