spring data jpa基本增删改查,复杂动态查询及分页

1、select

@Query("from User where id = ?1")
User queryById(Integer id);

@Query(" from User where id = ?1 and name = ?2")
User queryByIdAndName(Integer id,String name);

@Query("from User where id in (:ids)")
List<User> findByIds(@Param("ids") List<Integer> ids);

2、delete

@Modifying
@Query("delete from User where id = ?1")
void deleteByID(Integer id);

3、update

@Modifying
@Query("update User set name = :name where id = :id")
void updateByID(@Param("name") String name,@Param("id") Integer id);

4、动态查询(in、and、or、like、日期范围)

sql语句:select * from User  where (name like ?) and id = 1 and str in (1,2,3)
//查询条件拼接
private Specification<User> createSpecification(Map searchMap) {
        return new Specification<User>() {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                List<Predicate> predicates = new ArrayList<Predicate>();
                if (searchMap.get("id")!=null && !"".equals(searchMap.get("id"))) {
                    predicates.add(cb.equal(root.get("id"),searchMap.get("id")));
                }
                if (searchMap.get("name")!=null && !"".equals(searchMap.get("name"))) {
                    predicates.add(cb.like(root.get("name").as(String.class), "%"+(String)searchMap.get("name")+"%"));
                }
                String str = "1,2,3";
                String[] strs = str.split(",");
                CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get("str"));
                for (String s:strs) {
                    in.value(s);
                }
                predicates.add(in);
                return cb.and( predicateList.toArray(new Predicate[predicates.size()]));
            }
        };
}

 

sql语句: select * from User  where (name like ? or address is null) and id = 1
//查询条件拼接
private Specification<User> createSpecification(Map searchMap) {
        return new Specification<User>() {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                List<Predicate> predicates = new ArrayList<Predicate>();
                List<Predicate> predicateList = new ArrayList<Predicate>();
                if (searchMap.get("id")!=null && !"".equals(searchMap.get("id"))) {
                    predicates.add(cb.equal(root.get("id"),searchMap.get("id")));
                }
                if (searchMap.get("name")!=null && !"".equals(searchMap.get("name"))) {
                    predicateList.add(cb.like(root.get("name").as(String.class), "%"+(String)searchMap.get("name")+"%"));
                }
                if (searchMap.get("address")!=null && !"".equals(searchMap.get("address"))) {
                    predicateList.add(cb.isNull(root.get("address").as(String.class)));
                }
                Predicate predicateAnd = cb.and(predicateList.toArray(new Predicate[predicateList.size()]));
                predicateAnd = cb.and(predicateAnd);
                Predicate predicateOr = cb.or(predicates.toArray(new Predicate[predicates.size()]));
                predicateOr = cb.and(predicateOr);
                return query.where(predicateOr,predicateAnd).getRestriction();
            }
        };
}
sql语句: select * from User  where time>=? and time<=? and id = 1
//查询条件拼接
private Specification<User> createSpecification(Map searchMap) {
        return new Specification<User>() {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                List<Predicate> predicates = new ArrayList<Predicate>();
                if (searchMap.get("id")!=null && !"".equals(searchMap.get("id"))) {
                    predicates.add(cb.equal(root.get("id"),searchMap.get("id")));
                }
                if (searchMap.get("time")!=null && !"".equals(searchMap.get("time"))) {
                    //开始时间
                    Date date = user.getTime();
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTime(date);
                    calendar.set(Calendar.HOUR_OF_DAY,0);
                    calendar.set(Calendar.MINUTE, 0);
                    calendar.set(Calendar.SECOND, 0);
                    calendar.set(Calendar.MILLISECOND, 0);
predicates.add(cb.greaterThanOrEqualTo(root.get("time").as(Date.class), calendar.getTime()));
                    //结束时间
                    calendar.set(Calendar.HOUR_OF_DAY,23);
                    calendar.set(Calendar.MINUTE, 59);
                    calendar.set(Calendar.SECOND, 59);
                    calendar.set(Calendar.MILLISECOND, 999);
predicates.add(cb.lessThanOrEqualTo(root.get("time").as(Date.class), calendar.getTime()));
                }
                Predicate predicate = cb.and(list.toArray(new Predicate[predicates.size()]));
                return query.where(predicate).getRestriction();
            }
        };
}

5、实现分页、排序

不分页:
Map<String,Object> searchMap = new HashMap();
searchMap.put("id",1);
searchMap.put("name","zs");
searchMap.put("address",null);
//searchMap:传参
Specification<User> spec = createSpecificationLogin(searchMap);
List<User> list = userDao.findAll(spec);


分页、排序
Integer pageNo = 0; //页码
Integer pageSize = 10; //每页展示条数
if (!StringUtils.isEmpty(vo.getPageNo())) pageNo = vo.getPageNo() - 1;
if (!StringUtils.isEmpty(vo.getPageSize())) pageSize = vo.getPageSize();
Pageable page = new PageRequest(pageNo,pageSize,Sort.by("id").descending());//id为排序字段
Specification<User> spec = createSpecificationLogin(searchMap);
Page<User> pageList = userDao.findAll(spec, page);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值