欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot2.0使用Jpa快捷实现条件分页查询

程序员文章站 2022-04-30 13:59:40
...

一,示例需求
如下图所示,需要通过多条件模糊查询、需要分页、需要排序
SpringBoot2.0使用Jpa快捷实现条件分页查询
二,实体对象

package com.xxxxxx;

import lombok.Data;
import lombok.ToString;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Table;

@Data
@ToString
@Entity
@Table(name = "server_basic_info")
public class ServerBasicInfo {
    @javax.persistence.Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    // ip地址
    private String ipAddress;
    //服务器用户名
    private String serverUserName;
    //服务器密码
    private String serverPass;
    //业务分组
    private String businessGroup;
    //status
    private Integer status;
    private String creator;
    //系统类型
    private String sysType;


    //更新时间
    private String updateTime;
}

三,表结构

CREATE TABLE `server_basic_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ip_address` varchar(255) DEFAULT NULL,
  `server_user_name` varchar(255) DEFAULT NULL,
  `server_pass` varchar(255) DEFAULT NULL,
  `business_group` varchar(255) DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  `creator` varchar(255) DEFAULT NULL,
  `sys_type` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=112 DEFAULT CHARSET=gbk;

SpringBoot2.0使用Jpa快捷实现条件分页查询

四,业务实现

    @Override
    public QueryResponseResult findByPage(String ip, String group, String creator, String status, int page, int pageSize) {
        ServerBasicInfo sbi = new ServerBasicInfo();
        //为空则不set,不set则matcher实体没有该字段,则最终sql没有该字段,则表示不查询这个字段,符合需求
        //把需要模糊查询的字段塞到实体中
        if (StringUtils.isNotBlank(ip)) {
            sbi.setIpAddress(ip);
        }
        if (StringUtils.isNotBlank(group)) {

            sbi.setBusinessGroup(group);
        }
        if (StringUtils.isNotBlank(creator)) {

            sbi.setCreator(creator);
        }
        if (StringUtils.isNotBlank(status)) {
            sbi.setStatus(Integer.parseInt(status));
        }
        //ExampleMatcher.StringMatcher.CONTAINING表示前后匹配,相当于sql中的 like '%xxx%';withIgnoreCase()表示忽略大小写
        ExampleMatcher matcher = ExampleMatcher.matching().
                withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING).withIgnoreCase();

		//用前面构造好的查询对象和ExampleMatcher对象构造Example对象
		//备注1
        Example<ServerBasicInfo> ex = Example.of(sbi, matcher);

		//构造Pageable对象,其中需要指定页码和每页大小和返回结果的排序
		//Sort.Direction.DESC, "updateTime")表示返回结果按照updateTime字段倒排
		//备注2
        Pageable pageable = PageRequest.of(page, pageSize, Sort.by(Sort.Direction.DESC, "updateTime"));
        //进行分页条件查询,其中使用的就是备注1和备注2处构造的2个对象,这2个对象中包含了需求中所有的要素
        Page<ServerBasicInfo> pageSbi = serverBasicInfoRepository.findAll(ex, pageable);

        List<ServerBasicInfo> list = pageSbi.getContent();//本页数据列表
        long count = pageSbi.getTotalElements();//总共多少条数据
        int pagenum = pageSbi.getTotalPages();//多少页

        QueryResult queryResult = new QueryResult();
        queryResult.setList(list);
        queryResult.setTotal(count);
        queryResult.setTotal_pages(pagenum);


        return new QueryResponseResult(CommonCode.SUCCESS, queryResult);
    }
相关标签: SpringBoot Jpa