源码地址: 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 {
public List findUserByNameIsLike(String name);
}
这个相当于 select * from t_user where name like '具体值';
2、查询两个条件是两个值,
@Repository
public interface TUserRepository extends JpaRepository {
//这里的传参只能一个个列出来,不能传对象,否则jpa不能识别
public List 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 list = userRepository.findUserByAgeEqualsAndNameIsLike(user.getAge(),user.getName());
当然,多条件查询时,对于参数的传值除equals与 like外,其它sql里能实现的功能,jpa都能实现,大家可以根据idea提示了解,相信聪明的你能很快看得明白,这里就不逐个解释了
二、单表分页查询
jpa有封装好的分页实体类Pageable,我们可以直接使用,使用分页时直接在Repository方法传入Pageable参数就行,
以查询根据名字查询列表分页为例,方法如下
Repository 层如下
@Repository
public interface TUserRepository extends JpaRepository {
/**
* pageable分页封装参数的类,
*一定这个包下的类, org.springframework.data.domain.Pageable;
* 不要引入错了
*/
public Page findUserByNameIsLike(String name, Pageable pageable);
}
调用方法如下
Pageable pageable = new PageRequest(1,3);
Page 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