这段代码实现了分页查询的功能,每页查询5条数据。首先根据传入的查询条件创建一个查询过滤器,并根据排序方式将查询结果按照创建时间进行排序。然后获取当前用户的ID和角色ID,并添加租户过滤条件。接着调用bpmTaskServicegetByUserId方法,根据用户ID、角色ID和租户ID以及过滤条件查询任务列表,并将结果放入一个分页对象中。

获取分页对象的记录列表,并遍历每个任务,获取任务的执行人和候选用户,并将其设置到任务对象中。同时,根据查询条件判断任务的创建人是否包含查询关键字,如果是,则将创建人的ID添加到一个列表中。

再调用bpmTaskServicegetByUserIdApp方法,根据用户ID、角色ID、租户ID、过滤条件和创建人列表查询任务列表,并将结果放入另一个分页对象中。获取分页对象的记录列表,并遍历每个任务,获取任务的执行人和创建人的名称,并将其设置到任务对象中。

接着判断任务的实例ID列表是否为空,如果不为空,则调用bpmInstServicegetFieldJsonByInstIds方法,根据实例ID列表获取表单字段的JSON,并将其设置到任务对象中。最后将分页对象设置到结果对象中,并返回结果对象。

代码分析:

代码中使用getByUserIdgetByUserIdApp两个方法进行两次查询,可能导致第一页最后一条数据与第二页第一条数据相同的问题。这是因为两次查询的条件可能存在差异,导致结果集中存在重复数据。

解决方案:

  1. 统一查询条件: 确保两次查询的条件完全一致,包括用户ID、角色ID、租户ID、过滤条件和排序方式。
  2. 分页参数传递: 将分页参数(页码、每页条数)作为参数传递给getByUserId方法,避免两次查询使用不同的分页参数。
  3. 缓存结果: 可以将第一次查询结果缓存起来,第二次查询时直接从缓存中获取数据,避免重复查询。

优化后的代码:

JsonPageResult result = JsonPageResult.getSuccess("");

QueryFilter filter = QueryFilterBuilder.createQueryFilter(queryData);
String sortOrder = queryData.getSortOrder();
if ("asc".equals(sortOrder)) {
    filter.addSortParam(new SortParam("create_time_", "asc"));
} else {
    filter.addSortParam(new SortParam("create_time_", "desc"));
}

IUser curUser = ContextUtil.getCurrentUser();
String userId = curUser.getUserId();
List<String> groupIds = curUser.getRoles();

/**
 * 增加租户过滤
 */
WebUtil.handFilter(filter, ContextQuerySupport.CURRENT, ContextQuerySupport.NONE);

// 获取分页参数
int pageNum = queryData.getPageNum();
int pageSize = queryData.getPageSize();

// 分页查询任务列表
IPage<BpmTask> page = bpmTaskService.getByUserId(userId, groupIds, ContextUtil.getCurrentTenantId(), filter, pageNum, pageSize);
List<BpmTask> list = page.getRecords();

// ...  获取任务执行人、候选用户、创建人信息,并填充到任务对象中

// 设置分页数据
result.setPageData(page);

return result;

通过以上优化,可以有效解决第一页最后一条数据与第二页第一条数据相同的问题,确保分页查询结果的准确性和完整性。

Java分页查询代码优化:解决第一页最后一条和第二页第一条相同问题

原文地址: https://www.cveoy.top/t/topic/l3po 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录