Spring data jpa讲讲它的常用CRUD类,Sort的使用和PageRequest,还有JpaSpecificationExecutor!
作者:互联网
分享一篇,别人写的不错的!https://www.cnblogs.com/qianzf/p/9564141.html
先从官网文档来看,
官网虽然只是这么讲也木有错,在这里我要讲下的 就是Spring data系列这个方法几乎是通用的,
比如你看下面的mgdb
下面主要讲下,使用条件查询和@Query写 JPQL查询。
先把继承的接口方法列出来!
//查询所有
1.public List<User> findAll(){}
//条件查询+分页
2.public Page<User> findSearch(Map whereMap, int page, int size){
Specification<User> specification = createSpecification(whereMap);//createSpecification(Map whereMap);//构建多条件,但是只是基于本User类的属性
PageRequest pageRequest = PageRequest.of(page-1, size);
return userDao.findAll(specification, pageRequest);
}
3.public List<User> findSearch(Map whereMap) {}//一样的调用了createSpecification方法构建查询条件,
4.public void add(User user) {}//增加
5. public void update(User user) {userDao.save(user);}//修改
6.public void deleteById(String id) {}
常规的CRUD我知道的只有这些了,外加一个单表条件方法!
//查询User,单表,多条件
private Specification<User> createSpecification(Map searchMap) {
return new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicateList = new ArrayList<Predicate>();
// ID
if (searchMap.get("id")!=null && !"".equals(searchMap.get("id"))) {
predicateList.add(cb.like(root.get("id").as(String.class), "%"+(String)searchMap.get("id")+"%"));
}
// 手机号码
if (searchMap.get("mobile")!=null && !"".equals(searchMap.get("mobile"))) {
predicateList.add(cb.like(root.get("mobile").as(String.class), "%"+(String)searchMap.get("mobile")+"%"));
}
// 密码
if (searchMap.get("password")!=null && !"".equals(searchMap.get("password"))) {
predicateList.add(cb.like(root.get("password").as(String.class), "%"+(String)searchMap.get("password")+"%"));
}
// 昵称
if (searchMap.get("nickname")!=null && !"".equals(searchMap.get("nickname"))) {
predicateList.add(cb.like(root.get("nickname").as(String.class), "%"+(String)searchMap.get("nickname")+"%"));
}
// 性别
if (searchMap.get("sex")!=null && !"".equals(searchMap.get("sex"))) {
predicateList.add(cb.like(root.get("sex").as(String.class), "%"+(String)searchMap.get("sex")+"%"));
}
// 头像
if (searchMap.get("avatar")!=null && !"".equals(searchMap.get("avatar"))) {
predicateList.add(cb.like(root.get("avatar").as(String.class), "%"+(String)searchMap.get("avatar")+"%"));
}
return cb.and( predicateList.toArray(new Predicate[predicateList.size()]));
}
};
}
//多表多条件
private Specification<User> createSpecification(Map searchMap) {
return new Specification<User>() {
@Override
68 public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
69 List<Predicate> list = new ArrayList<>();
70 //根据userId 查询user
71 if (StringUtils.isNotBlank(params.getUserId())) {
72 list.add(cb.equal(root.get("userId").as(String.class), params.getUserId()));
73 }
74 //根据userName 模糊查询user
75 if (StringUtils.isNotBlank(params.getUserName())) {
76 list.add(cb.like(root.get("userName").as(String.class), "%" + params.getUserName() + "%"));
77 }
78 //根据gender 查询user
79 if (StringUtils.isNotBlank(params.getGender())) {
80 list.add(cb.equal(root.get("gender").as(String.class), params.getGender()));
81 }
82 //根据age>? 查询user
83 if (StringUtils.isNotBlank(params.getAge())) {
84 list.add(cb.gt(root.get("age").as(Integer.class), Integer.valueOf(params.getAge())));
85 }
86 //根据gradeName 查询user
87 if (StringUtils.isNotBlank(params.getGradeName())) {
88 Join<Grade, User> join = root.join("grade", JoinType.LEFT);
89 list.add(cb.equal(join.get("gradeName"), params.getGradeName()));
90 }
91 //根据schoolName 查询user
92 if (StringUtils.isNotBlank(params.getSchoolName())) {
93 Join<School, User> join = root.join("grade", JoinType.LEFT);
94 list.add(cb.equal(join.get("school").get("schoolName"), params.getSchoolName()));
95 }
96 Predicate[] pre = new Predicate[list.size()];
97 criteriaQuery.where(list.toArray(pre));
98 return cb.and(list.toArray(pre));
99 }
100 }
}
使用以下方式在Dao接口层写修改
@Modifying //告诉程序是删除修改的操作
@Query(value = "update tb_user set fanscount=fanscount+? where id=?", nativeQuery = true)
public void updatef(int x, String friendid);
//按顺序写参数,要注意的就是修改的值需要一个+号
也可以不加如下
@Modifying
@Query(value = "UPDATE tb SET islike=? WHERE userid = ? AND friendid = ?", nativeQuery = true)
public void update(String islike, String userid, String friendid);
@Query(value = "SELECT * FROM tb_problem WHERE id IN (SELECT problemid FROM tb_pl WHERE labelid=?) ORDER BY replytime DESC", nativeQuery = true) //不加@Modifying注解就是查询
public Page<Problem> newList(String labelid, Pageable pageable);//pageable这个是分页对象,也可以加
Sort sort = new Sort(Sort.Direction.ASC,"id");//sort 这个对象丢进去就能排序
暂时只想到这么多!
标签:Sort,String,get,jpa,cb,PageRequest,add,root,searchMap 来源: https://blog.csdn.net/weixin_41244495/article/details/88391862