【问题标题】:Thymeleaf pagination work not as describedThymeleaf 分页工作与描述不符
【发布时间】:2019-02-10 23:06:42
【问题描述】:

我在部门页面有Thymeleaf分页,效果很好,但我有一个问题。

当我尝试更新部门名称时,这个重命名的部门从页面中消失并在最后一页显示为最后一行。

我该如何解决这个问题?我想更新部门名称并将其放在同一个地方,而不是放在最后。

这是我的代码。

服务:

public Page<Department> findPaginatedDepartments(final Pageable pageable) {
        List<Department> departments = departmentRepository.findAll();
        int pageSize = pageable.getPageSize();
        int currentPage = pageable.getPageNumber();
        int startItem = currentPage * pageSize;
        final List<Department> list;

        if (departments.size() < startItem) {
            list = Collections.emptyList();
        } else {
            int toIndex = Math.min(startItem + pageSize, departments.size());
            list = departments.subList(startItem, toIndex);
        }
        return new PageImpl<>(list, PageRequest.of(currentPage, pageSize), departments.size());
    }

控制器:

 @GetMapping()
    public String getAllDepartments(
            Model model,
            @RequestParam("page") Optional<Integer> page,
            @RequestParam("size") Optional<Integer> size) {
        int currentPage = page.orElse(1);
        int pageSize = size.orElse(10);

        Page<Department> departmentPage = departmentService.findPaginatedDepartments(PageRequest.of(currentPage - 1, pageSize));
        model.addAttribute("departmentPage", departmentPage);
        int totalPages = departmentPage.getTotalPages();
        if (totalPages > 0) {
            List<Integer> pageNumbers = IntStream.rangeClosed(1, totalPages)
                    .boxed()
                    .collect(Collectors.toList());
            model.addAttribute("pageNumbers", pageNumbers);
        }
        return "/department/departments";
    }

查看:

<div class="departments_wrapper main_menu_wrapper">
    <div id="dep-grid" class="departments_table highlight">
        <div class="head_departments">
            <span class="head-left-grid" th:onclick="'javascript:sortDepartments()'">Name<i id="arrow-sort" class="tiny material-icons arrow-sort-button">expand_more</i></span>
            <span class="head-right-grid">Edit</span>
        </div>
        <ul>
            <div class="dep-body" th:each="department : ${departmentPage.content}">
                <li id="dep-li" class="left-column" th:text="${department.name}"></li>
                <li class="right-column">
                    <div class="dep_edit">
                        <a id="dep-modal-pic" class="edit_dep modal-trigger" href="#modal3"
                           th:onclick="'javascript:showFunctionModal(\'' + ${department.id} +'\' , \'' + ${department.name} +'\');'"><i
                                class="material-icons">more_horiz</i></a>
                    </div>
                </li>
            </div>
        </ul>
    </div>
    <div class="pagination pagination-dep">
        <ul>
            <li class="disabled"><a href="#!"><i class="material-icons">chevron_left</i></a></li>
            <li><a th:if="${departmentPage.totalPages > 0}" th:each="pageNumber : ${pageNumbers}"
                   th:href="@{/departments(size=${departmentPage.size}, page=${pageNumber})}" th:text="${pageNumber}"
                   th:class="${pageNumber==departmentPage.number + 1} ? active"></a></li>
            <li class="disabled"><a href="#!"><i class="material-icons">chevron_right</i></a></li>
        </ul>
    </div>
</div>

更新部门名称

@Transactional
public void updateDepartment(final Long id, final Department department) {
    final Department departmentFound = departmentRepository.getOne(id);
    departmentFound.setName(department.getName());
    departmentRepository.saveAndFlush(departmentFound);
}

【问题讨论】:

  • 您能否同时显示您更新部门名称以及您的部门类的服务?
  • 添加了代码。但我认为问题出在分页上。
  • 我用完全相同的代码进行了测试,除了我自己的实体。我无法重现您所说的相同问题,并且我检查了分页的底层实现是否一直使用 ArrayList 来保留顺序。我建议您在服务中从 findPaginatedDepartments 方法返回结果后在调试模式下运行并设置断点,并检查结果是否遵循正确的顺序,例如使用“select * from department”手动查询数据库时
  • 我发现了一些东西。在我的表中,所有看起来都在这个 8 dep8 9 dep9 10 dep10 15 dep15 16 dep16 17 deptest 中,当我编辑其中任何一个时,它将成为 db 中的最后一个
  • 发现很有趣的东西。当我更新 pgAdmin 中的字段时,它也无法正常工作。更新的字段下降

标签: spring model-view-controller pagination thymeleaf


【解决方案1】:

解决了! 经过多次搜索,我发现它是 postgres "feature"。 所以,在我的 DepartmentService 中,我刚刚编写了比较器,它将按 id 对 Departments 进行排序。 这解决了我的问题。

 final Comparator<Department> cmp = Comparator.comparing(Department::getId);

【讨论】:

  • 我建议你看看存储库中可用的 crud 方法。有些还提供分页功能和排序。这是因为通过使用 repository.findAll() 检索所有结果,然后使用代码进行过滤和排序,当结果集变得很大时,这往往是低效的。
  • 我已经在使用分页,但如果有更有趣的东西我会使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2023-03-09
  • 2012-10-16
相关资源
最近更新 更多