SpringBoot2.0使用Jpa快捷实现条件分页查询
程序员文章站
2022-04-30 13:59:40
...
一,示例需求
如下图所示,需要通过多条件模糊查询、需要分页、需要排序
二,实体对象
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;
四,业务实现
@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);
}
下一篇: 说说功能强大又好使的ref与$refs