【问题标题】:How to include search/filter in a table and include Pagination as well in Java SpringBoot?如何在表中包含搜索/过滤器并在 Java SpringBoot 中包含分页?
【发布时间】:2019-01-23 20:29:45
【问题描述】:

我正在使用 Java Spring Boot 和 thymeleaf 构建一个 Web 应用程序。我知道如何在其中包含分页。我关注了这个链接https://dzone.com/articles/pagingandsortingrepository-how-to-use-with-thymele

现在的问题是,如何包含搜索/过滤表单以及如何在搜索结果中包含分页? 我知道我可以使用 CriteriaBuilder(如下面的 findBuildings() 函数)来获取搜索结果,但是如何在其中加入分页?

私有 EntityManager em; public List findBuildings(Building searchedBuilding) {

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Building> cq = cb.createQuery(Building.class);
    Root<Building> quest = cq.from(Building.class);
    List<Predicate> predicates = new ArrayList<Predicate>();

    if (searchedBuilding.getAddress() != null) {
        predicates.add(cb.equal(quest.get("Address"), "%" + searchedBuilding.getAddress()+ "%"));
    }
    if (searchedBuilding.getBuildingType() != null) {
        predicates.add(cb.like(quest.get("BuildingType"), "%" + searchedBuilding.getBuildingType() + "%"));
    }
    // other predicates

    cq.select(quest).where(predicates.toArray(new Predicate[] {}));
    List<Building> buildings = em.createQuery(cq).getResultList();
    return buildings;
}

【问题讨论】:

    标签: java spring-boot criteria-api


    【解决方案1】:

    您可以使用弹簧数据 (https://spring.io/projects/spring-data)。

    创建一个存储库接口,并像这样创建您的查询:

    @Query(value = "select distinct b from Building b where b.Address like %:searchParam%")
    Page<Building> search(Pageable pageable, @Param("searchParam") String searchParam);
    

    你可以像这样在你的控制器中获取Pageable接口:

    @GetMapping("/your/path/{searchParam}")
    public ModelAndView getBuilding(Pageable pageable, @PathVariable String searchParam) {
        Page<Building> page = buildingRepository.search(peageable, searchParam);
        ....
        //your code here
    }
    

    在url中可以传递大小和当前页面。

    https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Pageable.html

    【讨论】:

    • 但是我有多个参数。我不想为每个可能的组合编写查询
    【解决方案2】:

    createQuery() 之后,要调用getResultList(),您必须执行以下操作:

    public List findBuildings(Building search, int firstResult, int pageSize) {
    
        //omitted ...
    
        Query query = em.createQuery(cq);
        query.setFirstResult(firstResult);
        query.setMaxResults(pageSize);
        List<Building> buildings = query.getResultList();
        return buildings;
    }
    

    firstResultmaxResult 的计算位置。

    例如,如果页面为 1,每页有 50 个元素->

    firstResult = 0

    maxResults = 50

    【讨论】:

    • 这听起来很合理,但我的模型接受了一个页面,然后将其用于制作导航栏。我想我可以使用它,然后在 dto 或其他东西中传递页码、页面大小和总数。
    • 不,你不能......但区别很简单。例如,假设您在第 4 页,并且想要显示 30 个元素。 firstResult = 4X30-1 -1 因为第一个元素是 0,而 maxResults=30 正是页面的大小
    • 我的错!我说的是我的看法。我至少需要总页数才能生成页面导航链接。
    • 在您的前端,您需要知道所选的页码和总页码(用计数计算)可能是因为用户也可以选择特定页面,但您可以编写一个计算的 util 方法带有 maxResult 的 firstElement 传递给 Query 对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多