【平台开发】— 10.条件模糊查询

简介: 【平台开发】— 10.条件模糊查询

项目管理功能,目前还剩下条件查询还没实现。


经过这么多章,可以看出用得套路都是差不多的。就像条件查询这个功能,我需要在后端实现一个条件查询的接口,供前端调用。


前端需要在组件里实现对应的方法与后端进行交互,最后页面查询按钮上绑定对应的方法。


一、后端


由于JPA也是支持动态查询的,所以优先还是使用现成的。


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 ,这里是关键哦。


1268169-20200730135738386-1866581747.png


2.service层


这里是修改的重点,谁叫它是干活的呢。


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个,因为查询后的结果也需要分页。


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


代码里实现的是可以通过项目名称或者项目id来查询,以项目名称为例:


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));
    }


测试通过。


1268169-20200730140038226-272414275.png


二、前端


前端这次只需要改动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则是增加一个清空输入的按钮。


1268169-20200730140236070-1094966070.png


全部弄完了,测试一下模糊查询。


1268169-20200730140248076-1901421839.png


通过。


后面的功能实现基本都是这样的套路了,应该不会像这样前后端铺开写了,有知识点或者思路想法之类的会记录。

相关文章
接口数据多条件搜索(模糊查询)
接口数据多条件搜索(模糊查询)
230 0
|
5月前
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用问题之是否可以在筛选条件上增加筛选单行文本的内容
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
阿里云云效产品使用问题之是否可以在筛选条件上增加筛选单行文本的内容
|
5月前
|
NoSQL BI MongoDB
深入理解 MongoDB 条件操作符:优化查询、精准筛选、提升性能
深入理解 MongoDB 条件操作符:优化查询、精准筛选、提升性能
121 1
|
6月前
|
SQL 关系型数据库 MySQL
【MySQL-8】DQL-查询语句全解 [ 基础/条件/分组/排序/分页查询 ](附带代码演示&案例练习)
【MySQL-8】DQL-查询语句全解 [ 基础/条件/分组/排序/分页查询 ](附带代码演示&案例练习)
|
5月前
|
SQL 数据库 UED
条件筛选大作战:解析Where与Having的区别与应用
条件筛选大作战:解析Where与Having的区别与应用
44 0
|
6月前
|
SQL 前端开发
基于jeecgboot复杂sql查询的列表自定义列实现
基于jeecgboot复杂sql查询的列表自定义列实现
54 0
|
6月前
|
XML Java 数据库连接
【MyBtis】各种查询功能
【MyBtis】各种查询功能
102 0
|
6月前
|
SQL Java Spring
MybatisPlus-条件查询方式及多条件构建查询
MybatisPlus-条件查询方式及多条件构建查询
839 0
|
11月前
|
SQL Java UED
通用查询------------详细讲解通用 查询所有,模糊查询,分页查询集为一体,一个方法解决三个查询
通用查询------------详细讲解通用 查询所有,模糊查询,分页查询集为一体,一个方法解决三个查询
|
11月前
|
SQL 安全 Java
MyBatid动态语句且模糊查询
MyBatid动态语句且模糊查询
60 0