当前位置: 首页 > 知识库问答 >
问题:

在Jpa中使用服务器端分页查询聚合sql的最佳方法是什么?

符懿轩
2023-03-14

你好,我试图实现的是获得页面返回的结果,结果进入DTO,并要求可分页。我如何正确地做这件事?

我发现了几个方法,但我不确定,也不舒服。我尝试了所有的QueryDsl方法,但是当使用聚合函数(如sum()和group By)和多列时,它有“计数”限制,现在将在我的存储库中使用@Query()注释编写nativeQuery,如下所示:

    @Query(name = "find_stock_total", nativeQuery = true)
    Page<StockTotalResponseDto> findStockTotalRsMap(Pageable pageable);

然后在我的实体类中,我必须编写@NamedNativeQueries并用@SqlResultSetMappings对其进行映射,我是这样写的:

@NamedNativeQueries({
        @NamedNativeQuery(
                name = "find_stock_total",
                query = "SELECT product_id, product_code, sum(qty) FROM "book_stock"
    where warehouse_code = 'GBKTJKT1' and product_code in('MCM-508','TL-101') and branch_code = 'JKT' and branch_id = '1'
    GROUP BY product_id, product_code",
                resultSetMapping = "stock_total_response_dto"
        ),
        @NamedNativeQuery(
                name = "find_stock_total.count",
                query = "select count(*) from (
    SELECT product_id, product_code, sum(qty) FROM "book_stock"
    where warehouse_code = 'GBKTJKT1' and product_code in('MCM-508','TL-101') and branch_code = 'JKT' and branch_id = '1'
    GROUP BY product_id, product_code
) as count"
        )
})
@SqlResultSetMappings({
        @SqlResultSetMapping(
                name = "stock_total_response_dto",
                classes = @ConstructorResult(
                        targetClass = StockTotalResponseDto.class,
                        columns = {
                                @ColumnResult(name = "product_id", type = String.class),
                                @ColumnResult(name = "product_code", type = String.class),
                                @ColumnResult(name = "sum", type = BigInteger.class)
                        }
                )
        ),
        @SqlResultSetMapping(
                name = "stock_total_response_dto.count",
                columns = @ColumnResult(name = "count")
        )
})
@Entity

我必须在一个@Entity类中编写sql字符串,我不能使用Pageable提供的排序,我必须编写额外的计数查询。我想使用可分页排序,对我的数据进行排序。有没有其他更好的方式或者更现代的方式来写这样的东西?也许有人可以提供“标准”的方式或有另一个Jpa的方式?或者比这更好的?

共有1个答案

顾承平
2023-03-14

您应该检查Blaze Persistence提供了什么,它可以在JPA/Hibernate之上工作,并且还与spring data JPA集成,允许您使用它作为spring data JPA通常的替代品。

它正确支持聚合函数(也用于计数查询),支持键集分页等等。检查有关Spring Data集成的留档:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/#spring-data-integration

 类似资料:
  • 问题内容: 如果您还希望获得结果总数(在进行分页之前),那么在SQL Server 2000、2005、2008、2012中对结果进行分页的最佳方法(从性能角度而言)是什么? 问题答案: 获取结果总数和分页是两个不同的操作。为了这个示例,我们假设您要处理的查询是 在这种情况下,您可以使用以下方法确定结果总数: …这看似效率低下,但假设所有索引等均已正确设置,实际上却表现不错。 接下来,要以分页的方

  • 我正在使用java servlet编写一个简单的服务器。为了从数据库中获取数据,我编写了一个特殊的Dao层类,我想知道我应该在哪里存储SQL查询? 我需要创建一个特殊的类,将查询存储为最终字符串,还是有更有效的方法来实现?

  • 尝试使用CompletionSuggester for autocomplete特性,通过Java的RestHighLevelClient实现CompletionSuggester有不同的方法,想知道以下这些方法之间(在性能/查询执行速度方面)有什么区别吗 1:使用CompletionSuggestionBuilder: 2:使用SimpleQueryString

  • 问题内容: 我将使用C / C ++,并想知道与MySQL服务器对话的最佳方法。我应该使用服务器安装随附的库吗?除了官方图书馆外,我还应该考虑其他优秀的图书馆吗? 问题答案: MySQL ++

  • 我正在使用JPA Spring开发Web应用程序。我的项目层结构是web- 我的应用程序在 http 会话中获取存储的域实体。在我对实体执行任何数据库操作之前,需要使用 merge 将其重新附加到实体管理器。我想知道将实体合并到实体管理器的最佳方法。目前每次调用事务方法时,我都会调用 genericDAO.merge(object)。例如: 有没有其他更好的方法来做到这一点。有什么设计模式可用吗?

  • 问题内容: 我有一个有趣的任务,要求我将服务器(ASP.NET)的动态生成文件下载到客户端。在客户端,它只是JavaScript(jQuery),并且客户端能够生成很多参数来定制数据的导出方式。 我不知道如何在不重新加载页面的情况下下载文件(我不确定$.ajax在这种情况下是否可以工作)。有人可以给我一些关于这个话题的指导吗?谢谢。 问题答案: 首先,您可以从处理程序创建文件 假设您有要下载的文件