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 這個對象丟進去就能排序

暫時只想到這麼多!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章