使用 Java 实现分页(命名查询)

Posted

技术标签:

【中文标题】使用 Java 实现分页(命名查询)【英文标题】:Implement pagination using Java (Named Query) 【发布时间】:2013-11-15 08:18:32 【问题描述】:

这里是场景。我有一个显示所有记录列表的页面(没有分页)。

现在在后端,使用每个部分的 2 个单独命名查询的组合来检索记录(每个部分用于实际记录/part1/part2 的计数);

@NamedQuery(name = "CustomDOTO.findPart1", query = "SELECT part1";
@NamedQuery(name = "CustomDOTO.findPart1Count", query = "SELECT count(part1)";
@NamedQuery(name = "CustomDOTO.findPart2", query = "SELECT part2";
@NamedQuery(name = "CustomDOTO.findPart2Count", query = "SELECT count(part2)";

现在我需要实现相同的分页。 所以我使用一个自定义类 PagedResponse 来做同样的事情 它实际上只包含两件事;

private Long totalRecords;
private List<T> records;

我还使用自定义方法 runPaginatedQuery 来返回分页响应;

protected <T> PagedResponse<T> runPaginatedQuery(Query query, Query cntQuery, int startingResult, int maxResults) 


我的问题是,因为我有 2 个单独的命名查询,如果我为每个命名查询调用 runPaginatedQuery 方法 2 次,它对我没有帮助,因为每次调用的最大结果都会增加。 我如何在 Java 端处理同样的问题?我已经准备好处理 UI。

【问题讨论】:

【参考方案1】:

我曾经遇到过类似的问题。不要使用两个查询,使用一个并将其参数化,使其使用LIMIT,并使用例如一个变量来指示当前页面的编号,以及一些定义您将在一页上获得多少结果的常量。

然后你会有类似的东西

 LIMIT :offset, :resultsLimit

您将offset 设置为(page - 1) * DEFAULT_LIMIT_PER_PAGE,将resultsLimit 设置为DEFAULT_LIMIT_PER_PAGE

希望有帮助!

【讨论】:

非常感谢......命名查询本身的这种修改......还是对 executePaginatedQuery 方法的任何更新? 由于某些原因,我现在意识到我无法合并这两个查询,因为它们是有条件地调用的......所以在某些情况下,它可能只是 1,在其他情况下,这两个查询也可以得到叫... 所以我需要看看可以在分页java代码中处理的东西 您能发布所有相关代码,尤其是查询代码吗?

以上是关于使用 Java 实现分页(命名查询)的主要内容,如果未能解决你的问题,请参考以下文章

[原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询

java查询的分页思路!!

java分页

Java分页查询--分页显示

HQL分页查询 对象导航查询外置命名查询连接查询查询过滤器统计查询

分页查询的实现原理