【平臺開發】— 10.條件模糊查詢

項目管理功能,目前還剩下條件查詢還沒實現。前端

通過這麼多章,能夠看出用得套路都是差很少的。就像條件查詢這個功能,我須要在後端實現一個條件查詢的接口,供前端調用。vue

前端須要在組件裏實現對應的方法與後端進行交互,最後頁面查詢按鈕上綁定對應的方法。spring

1、後端

因爲JPA也是支持動態查詢的,因此優先仍是使用現成的。sql

1.dao層

在dao層裏須要作個修改,讓ProjectDAO再多繼承一個類:JpaSpecificationExecutor數據庫

package com.mock.platform.dao;

import com.mock.platform.pojo.Project;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

public interface ProjectDAO extends JpaRepository<Project, Integer>, JpaSpecificationExecutor {

}

能夠看一下JpaSpecificationExecutor類,提供了5個方法,不過每一個方法都有一個Specification<T> var1 ,這裏是關鍵哦。後端

2.service層

這裏是修改的重點,誰叫它是幹活的呢。api

public Page<Project> searchProject(Project project, int number, int size) {
        Sort sort = Sort.by(Sort.Direction.DESC, "id");
        Pageable pageable = PageRequest.of(number - 1, size , sort);
        Specification<Project> query = new Specification<Project>() {
            @Override
            public Predicate toPredicate(Root<Project> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                List<Predicate> predicates = new ArrayList<>();
                if (project.getId() != null) {
                    predicates.add(criteriaBuilder.equal(root.get("id"), project.getId()));
                }
                if (StringUtils.isNotEmpty(project.getProjectName())) {
                    predicates.add(criteriaBuilder.like(root.get("projectName"), "%" + project.getProjectName() + "%"));
                }
                return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
            }
        };
        return projectDAO.findAll(query, pageable);
    }

這裏就用了上述5個方法的第3個,由於查詢後的結果也須要分頁。app

Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);

代碼裏實現的是能夠經過項目名稱或者項目id來查詢,以項目名稱爲例:ide

predicates.add(criteriaBuilder.like(root.get("projectName"), "%" + project.getProjectName() + "%"));
  • "projectName"對應project 實體裏的projectName屬性。
  • root.get("projectName")獲取屬性對應的數據庫表字段。
  • project.getProjectName()獲取當前傳入的查詢條件值。
  • like就是模糊匹配了,配合%xxx%使用。
  • criteriaBuilder會構建出對應的sql語句 。

固然這只是一個簡單查詢,and或者or 就不展開了,後面用到的時候再說。測試

3.controller

這裏就很簡單了,由於活兒都派給service了。

@GetMapping("/searchProject")
    public Object searchProject(Project project, int number, int size) throws Exception {
        return Result.success(projectService.searchProject(project, number, size));
    }

測試經過。

2、前端

前端此次只須要改動project.vue就行了,增長對應的查詢方法。

對了,在此以前,還要增長對應的api 。

//src/api/project.js

export function searchProject(projectName, number, size) {
    return request({
      url: '/my_platform/project/searchProject',
      method: 'get',
      params: {
        'projectName': projectName,
        'number': number,
        'size': size
      }
    })
}

vue組件裏methods裏增長對應的方法.
projectName 是空的時候,若是點擊了查詢按鈕,就從新請求下列表頁。
projectName 不爲空,那就能夠調用搜索項目的方法 searchProject()

handleProjectSearch() { //條件查詢
        if (this.listQueryInfo.projectName === undefined || this.listQueryInfo.projectName === '') {
          this.projectGet()
        } else {
          searchProject(this.listQueryInfo.projectName, this.pageInfo.number, this.pageInfo.size).then(response => {
            this.list = response.data.content
            this.pageInfo.size = response.data.size
            this.pageInfo.number = response.data.number + 1
            this.pageInfo.totalElements = response.data.totalElements
            this.pageInfo.totalPages = response.data.totalPages
            this.pageInfo.numberOfElements = response.data.numberOfElements
            this.listLoading = false
          })
        }
      }

頁面元素部分,就是改動查詢條件輸入框和查詢按鈕部分。

<div class="filter-container">
      <el-input placeholder="項目名稱" style="width: 200px;" class="filter-item" v-model="listQueryInfo.projectName"
                @keyup.enter.native="handleProjectSearch(listQueryInfo.projectName)" clearable/>
      <el-button class="filter-item"  type="primary" icon="el-icon-search" style="margin-left:10px;"
                 @click="handleProjectSearch(listQueryInfo.projectName)">
        查詢
      </el-button>
      <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-edit"
                 @click="projectCreate(createInfo)">
        新建
      </el-button>
    </div>

@keyup.enter.native屬性能夠敲回車鍵查詢 ,clearable則是增長一個清空輸入的按鈕。

所有弄完了,測試一下模糊查詢。

經過。

後面的功能實現基本都是這樣的套路了,應該不會像這樣先後端鋪開寫了,有知識點或者思路想法之類的會記錄。

相關文章
相關標籤/搜索