使用 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检索方式,分页查询,命名查询语句,投影查询,报表查询