springboot-jpa单表多条件查询、分页查询----springboot-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,而还可以传多个
————————————————
版权声明:本文为CSDN博主「森森之火」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yb546822612/article/details/101347263

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值