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

ac44735b77d89396e4029542d88eb004.png

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

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

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

一、后端

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

4fef56927620786a695e8ad433ee7036.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));
    }

测试通过。

785f42315044c4477daa50567636a694.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则是增加一个清空输入的按钮。

1563e7887c8250a847b0c02083959b14.png

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

62e68395af48a56243685771655d8b67.png

通过。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值