springboot-jpa单表多条件查询、分页查询----springboot-jpa分享(二)

源码地址:  https://gitee.com/xing_xin/springboot-jpa.git 

此篇承接  springboot-jpa环境搭建与应用-----springboot-jpa分享(一)

  上一篇我们分享了springboot-jpa的一些最简单的用法,如增删改查最基本的最简单的方法,这一篇主要分享jpa的软高级且常用 的用法,如对单表的多个条件查询、分页查询

一、单表的多个条件查询

   上一篇,我们在repository继承JpaRepository后,任何都不用写,表面看就一个空的repository,别看就这个空的接口,我们都能

实现简单的增删改查,不过这种写法是有局限的,如果没有什么查询需求,增删改基本就够用了,但是对单表更多个性化的查询,这种写法就不行了,那么倒底怎样实现个性化查询,

     比如以user表为例,user表有以下字段

     id、 name、 age、 scholl、 sex 

    我们希望以其中一个或多个实现查询,怎么办?

    其实不用担心 ,jpa底屋已经帮我实现好了,

     具体写法如下

  1、查询条件是一个值

  

@Repository
public interface TUserRepository extends JpaRepository<User,Long> {
 
    public List<User> findUserByNameIsLike(String name);
}

   这个相当于 select * from t_user where name like '具体值';

    2、查询两个条件是两个值,

@Repository
public interface TUserRepository extends JpaRepository<User,Long> {
    //这里的传参只能一个个列出来,不能传对象,否则jpa不能识别
    public List<User> findUserByAgeEqualsAndNameIsLike(String age,String name);
}

 这个表示根据age与name查询列表,相当于select * from t_uesr where age ='具体值'  and name like '具体值'

注:对于模糊查询 like 的传值,如果想模糊匹配,你必须在参数里虽通配符 ,如希望name字段前后模糊匹配,name的参数必须写成%+name+%,另外对于like的写法 有两种 ,分别是 findUserByNameIsLike和findUserByNameLike,经过测试,传参相同,结果也相同, 笔者认这个人习惯问题,不必太纠结

上面方法在调用时参数写法如下,

        User user = new User();
        user.setName("%test%");
        user.setAge("1_7"); 
List<User> list = userRepository.findUserByAgeEqualsAndNameIsLike(user.getAge(),user.getName());

当然,多条件查询时,对于参数的传值除equals与 like外,其它sql里能实现的功能,jpa都能实现,大家可以根据idea提示了解,相信聪明的你能很快看得明白,这里就不逐个解释了

二、单表分页查询

    jpa有封装好的分页实体类Pageable,我们可以直接使用,使用分页时直接在Repository方法传入Pageable参数就行,

 以查询根据名字查询列表分页为例,方法如下

 Repository 层如下

@Repository
public interface TUserRepository extends JpaRepository<User,Long> {
    /**
     * pageable分页封装参数的类,
     *一定这个包下的类, org.springframework.data.domain.Pageable;
     * 不要引入错了
     */

    public Page<User> findUserByNameIsLike(String name, Pageable pageable);

}

  调用方法如下

        Pageable pageable = new PageRequest(1,3);

        Page<User> page = userRepository.findUserByNameIsLike(user.getName(),pageable);

      
        System.out.println(page);

返回page对象如下

content:返回对象的集合,totalPages总页数,当前页:Number:1 ,总记录数:TotalElements

运行结果如下

getContent :[User(id=8, name=test1_5, age=1_5, school=school1_5, sex=男_5), User(id=9, name=test1_6, age=1_6, school=school1_6, sex=男_6), User(id=10, name=test1_7, age=1_7, school=school1_7, sex=男_7)]
getTotalPages :3
getNumber:1
getTotalElements:8

从上面我们知道,对于分页查询,主要功能归功能于 PageRequest类,打开 源码如下

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.data.domain;

import org.springframework.data.domain.Sort.Direction;
import org.springframework.lang.Nullable;

public class PageRequest extends AbstractPageRequest {
    private static final long serialVersionUID = -4541509938956089562L;
    private final Sort sort;

    /** @deprecated */
    @Deprecated
    public PageRequest(int page, int size) {
        this(page, size, Sort.unsorted());
    }

    /** @deprecated
     * 排序参数direction
     */
    @Deprecated
    public PageRequest(int page, int size, Direction direction, String... properties) {
        this(page, size, Sort.by(direction, properties));
    }

    /** @deprecated */
    @Deprecated
    public PageRequest(int page, int size, Sort sort) {
        super(page, size);
        this.sort = sort;
    }

    public static PageRequest of(int page, int size) {
        return of(page, size, Sort.unsorted());
    }

    public static PageRequest of(int page, int size, Sort sort) {
        return new PageRequest(page, size, sort);
    }

    public static PageRequest of(int page, int size, Direction direction, String... properties) {
        return of(page, size, Sort.by(direction, properties));
    }

    public Sort getSort() {
        return this.sort;
    }

    public Pageable next() {
        return new PageRequest(this.getPageNumber() + 1, this.getPageSize(), this.getSort());
    }

    public PageRequest previous() {
        return this.getPageNumber() == 0?this:new PageRequest(this.getPageNumber() - 1, this.getPageSize(), this.getSort());
    }

    public Pageable first() {
        return new PageRequest(0, this.getPageSize(), this.getSort());
    }

    public boolean equals(@Nullable Object obj) {
        if(this == obj) {
            return true;
        } else if(!(obj instanceof PageRequest)) {
            return false;
        } else {
            PageRequest that = (PageRequest)obj;
            return super.equals(that) && this.sort.equals(that.sort);
        }
    }

    public int hashCode() {
        return 31 * super.hashCode() + this.sort.hashCode();
    }

    public String toString() {
        return String.format("Page request [number: %d, size %d, sort: %s]", new Object[]{Integer.valueOf(this.getPageNumber()), Integer.valueOf(this.getPageSize()), this.sort});
    }
}

对于分页时的参数,我们可以传很多,除了上面的例子中我们传的page和size外,还有传排序参数sort,而还可以传多个

  

源码地址:  https://gitee.com/xing_xin/springboot-jpa.git

发布了57 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/yb546822612/article/details/101347263