Spring+JPA实现分页查询

Spring+JPA实现分页查询

说明

组长分派我写一个简单的后代管理,实现增删改查即可,鉴于本人水平较差,将不熟练的分页查询记录下来,
方便以后复用。
我用JPA和数据库进行交互,也就是说自己的Repository需要继承 JpaSpecificationExecutor<T>,
继承了之后可以使用JPA自带的findAll()方法
(Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);)。
这个findAll需要传入两个参数,一个是Specification,一个是Pageable 。
这样我们实现的思路就很清晰了,获取这两个参数就可以了。

代码

//我定义的定义的实体类,PagePojo,获取前端传来的分页参数;UserEntity,对应数据库字段的实体类


package cn.wildfirechat.app.pojo;

/**
 * 分页VO
 * @since 2021/11/24
 */
@Data
public class PagePojo {
    private int limit;
    private int page;
    private String userName;
}

//实体类 UserEntity
import javax.persistence.*;
import java.io.Serializable;
import java.security.MessageDigest;
import java.util.Base64;
import java.util.Date;
/**
 * wfchat数据库的t_user表
 * * @since 2021/11/6
 */
@Entity
@Table(name = "t_user")
public class UserEntity implements Serializable {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    @Column(name = "_uid")
    private String userId;
    @Column(name = "_name")
    private String name;
    @Column(name = "_passwd_md5")
    private String password;
    @Column(name = "_display_name")
    private String displayName;
    @Column(name = "_portrait")
    private String portrait;
    @Column(name = "_gender")
    private int gender;
    @Column(name = "_mobile")
    private String mobile;
    @Column(name = "_email")
    private String email;
    @Column(name = "_address")
    private String address;
    @Column(name = "_company")
    private String company;
    @Column(name = "_social")
    private String social;
    @Column(name = "_extra")
    private String extra;
    @Column(name = "_type")
    private int type;
    @Column(name = "_dt")
    private int dt;
    @Column(name = "_createTime")
    private java.util.Date createTime;
    @Column(name = "_deleted")
    private int deleted;


    public UserEntity() {

    }
    
 public UserEntity(Integer id,String userId, String name, String password, 
 String displayName, String portrait, int gender, String mobile, 
 String email, String address, String company, String social, 
 String extra, int type) {
        this.id = id;
        this.userId = userId;
        this.name = name;
        this.password = password;
        this.displayName = displayName;
        this.portrait = portrait;
        this.gender = gender;
        this.mobile = mobile;
        this.email = email;
        this.address = address;
        this.company = company;
        this.social = social;
        this.extra = extra;
        this.type = type;
    }

    public String getUserId() {
        return userId;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            String passwdMd5 = Base64.getEncoder()
            .encodeToString(md5.digest(password.getBytes("utf-8")));

            this.password = passwdMd5;
        } catch (Exception e)
        {
            System.out.println("密码加密失败!");
        }
    }

    public String getDisplayName() {
        return displayName;
    }

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    public String getPortrait() {
        return portrait;
    }

    public void setPortrait(String portrait) {
        this.portrait = portrait;
    }

    public int getGender() {
        return gender;
    }

    public void setGender(int gender) {
        this.gender = gender;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public String getSocial() {
        return social;
    }

    public void setSocial(String social) {
        this.social = social;
    }

    public String getExtra() {
        return extra;
    }

    public void setExtra(String extra) {
        this.extra = extra;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public int getDt() {
        return dt;
    }

    public void setDt(int dt) {
        this.dt = dt;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public int getDeleted() {
        return deleted;
    }

    public void setDeleted(int deleted) {
        this.deleted = deleted;
    }
}

//UserEntityRepository的代码

import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

import java.util.List;

/**
 * @Data 2021/11/6
 */
@RepositoryRestResource()
public interface UserEntityRepository extends CrudRepository<UserEntity,Integer> , 
JpaSpecificationExecutor<UserEntity> {

}

//controller层代码
    /*展示用户*/
    @PostMapping(value = "show_all_user",produces = "application/json;charset=UTF-8")
    public Object showAllUser(@RequestBody PagePojo pagePojo){
        int limit = pagePojo.getLimit();
        int page = pagePojo.getPage();
        String userName = pagePojo.getUserName();
        return mService.showAllUser(limit,page,userName);
    }

//service层代码
    RestResult showAllUser(int limit,int page,String userName);

//serviceImp层代码

    /*展示全部用户*/
    @Override
    public RestResult showAllUser(int limit,int pageNum,String userName) {
        //排序
        Sort sort =  Sort.by(Sort.Direction.ASC, "id");
        //查询
        //新建pageable
        Pageable pageable = PageMapper.of(pageNum, limit);
        //新建Specification查询构造器
        Specification<UserEntity> specification = new Specification<UserEntity>() {
            private static final long serialVersionUID = 1L;
            @Override
            public Predicate toPredicate(Root<UserEntity> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                Predicate predicate = criteriaBuilder.conjunction();
                /*
				*如果是查询全部的用户,可以不用写限制条件,直接Override就可以了,
				*如果有限制条件,还需要写下面的限制条件
				*/
                //type是表t_user的字段名,这是在查询中加了限定条件,限制了查出的数据type只能是0
                predicate.getExpressions().add(criteriaBuilder.equal(root.get("type"),  0));
                //判断前端传来的userName是否为空
                if(org.apache.commons.lang3.StringUtils.isNotBlank(userName)){
                    //userId是表t_user的的字段名,
                    //如果userName不为空,进行模糊查询,模糊查询的字段为userName
                    predicate.getExpressions().add(criteriaBuilder.like(root.get("userId"),  "%" + userName + "%"));
                }
                return predicate;
            }
        };
		//将specification和pageable两个参数传入page中
        Page<UserEntity> page = userEntityRepository.findAll(specification, pageable);
        //pageMapper中需要的参数,page的长度,page的内容(用户的集合),页码,条数
        PageMapper<UserEntity> pageInfo = new PageMapper<UserEntity>(page.getTotalElements(),page.getContent(),pageNum,limit);
        //我直接把查询到的用户传给了前端
        return RestResult.ok(pageInfo);
    }



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值