类继承图
(类名-> 右击-> diagram->show diagram)

Hibernate JPA 查询快速入手

接口类dao继承
1.JpaSpecificationExecutor:封装 JPA Criteria 查询条件
T findOne(Specification var1);
List findAll(Specification var1);
Page findAll(Specification var1, Pageable var2);
List findAll(Specification var1, Sort var2);
long count(Specification var1);

2.JpaRepository:分页、排序、增删改查
CrudRepository 中的save方法是相当于merge+save ,它会先判断记录是否存在,如果存在则更新,不存在则插入记录。
(通过id是否设置)

一.简单查询
1.findBy字段名(注意:字段名要与实体类中字段名保持一致)
Eg:findByName findByContentLike……
关键词:
Hibernate JPA 查询快速入手

  1. @Query注解(自己写sql语句,传参)
    Eg:
    @Query("select t from Task t where t.taskName = ? and t.createTime = ?”)
    Task findByTaskName(String taskName, Date createTime);
    @Query("select t from Task t where t.taskName = :taskName and t.createTime = :createTime”)
    Task findByTaskName(String taskName, Date createTime);

二.复杂查询
Page list = productEntityRepo.findAll(new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
//匿名内部类 封装查询的一系列条件
});
//排序
单个字段:Sort sort = new Sort(Direction.DESC,”字段名”);//字段名为实体类中的字段一致,不是数据库的
多个字段:
List<Sort.Order> orderList = new ArrayList<>();
Sort.Order order1 = new Sort.Order(Sort.Direction.DESC,"createTime”);
Sort.Order order2 = new Sort.Order(Sort.Direction.DESC,“age”);
orderList.add(order);
Sort sort = new Sort(orderList);//可以new数组
//分页
PageRequest pr = new PageRequest(pageNo-1,pageSize);
PageRequest pr = new PageRequest(pageNo-1,pageSize,sort);//分页加排序
List predicates = new ArrayList<>();
predicates.add(cb.equal(root.get(“prodStatus”).as(Integer.class), reqBO.getProdStatus()));//等于
predicates.add(cb.between(root.get(“prodDeadline”).as(Integer.class), 0, 365));//范围之间 le ge
predicates.add(cb.like(root.get(“prodName”).as(String.class), “%” + reqBO.getProductNameOrCode() + "%”));//模糊查询
predicates.add(root.get(“prodCode”).in(prodcodes));//in关系
cq.where(predicates.toArray(new Predicate[]{}));
//or关系 查询名称或代码等于prodNameOrCode字段的
Predicate p1 = cb.like(root.get(“prodName”).as(String.class), “%” + reqBO.getProductNameOrCode() + “%”);
Predicate p2 = cb.like(root.get(“prodCode”).as(String.class), “%” + reqBO.getProductNameOrCode() + “%”);
predicates.add(cb.or(p1,p2));

实例代码:

//dao层
public interface ProdDicEntityRepo extends JpaSpecificationExecutor, JpaRepository<ProdDicEntity, String> {
}

     //业务层
Page<ProductEntity> list = productEntityRepo.findAll(new Specification<ProductEntity>() {
    @Override
    public Predicate toPredicate(Root<ProductEntity> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
        List<Predicate> predicates = new ArrayList<>();
        if (CommonUtil.isPositive(reqBO.getProdStatus())) {//产品状态(发行状态)
            predicates.add(cb.equal(root.get("prodStatus").as(Integer.class), reqBO.getProdStatus()));
        }
        if (CommonUtil.isPositive(reqBO.getProdType())) {//产品类型
            predicates.add(cb.equal(root.get("prodType").as(Integer.class), reqBO.getProdType()));
        }
        if (CommonUtil.isPositive(reqBO.getProdDeadline())) {//产品期限  比较
            switch (reqBO.getProdDeadline()) {
                case 0://一年以内
                    predicates.add(cb.between(root.get("prodDeadline").as(Integer.class), 0, 365));
                    break;
                case 1://1-5年
                    predicates.add(cb.between(root.get("prodDeadline").as(Integer.class), 365, 365 * 5));
                    break;
                case 2://5年及以上
                    predicates.add(cb.greaterThanOrEqualTo(root.get("prodDeadline").as(Integer.class), 365 * 5));
                    break;
            }
        }
        if (CommonUtil.isPositive(reqBO.getStartPurchasePoint())) {//起购起点
            switch (reqBO.getStartPurchasePoint()) {
                case 0://5万及以下
                    predicates.add(cb.between(root.get("startPurchasePoint").as(Integer.class), 0, 50000));
                    break;
                case 1://5-100万
                    predicates.add(cb.between(root.get("startPurchasePoint").as(Integer.class), 50000, 1000000));
                    break;
                case 2://100万及以上
                    predicates.add(cb.greaterThanOrEqualTo(root.get("startPurchasePoint").as(Integer.class), 1000000));
                    break;
            }
        }
        List<Predicate> listPermission=new ArrayList<>();
        if (!StringUtils.isEmpty(reqBO.getProductNameOrCode())) {//产品代码或名称
            Predicate p1 = cb.like(root.get("prodName").as(String.class), "%" + reqBO.getProductNameOrCode() + "%");
            Predicate p2 = cb.like(root.get("prodCode").as(String.class), "%" + reqBO.getProductNameOrCode() + "%");
            predicates.add(cb.or(p1,p2));
        }
        cq.where(predicates.toArray(new Predicate[]{}));

        return  null;
    }
    }, pr);

相关文章:

  • 2021-11-30
  • 2022-02-24
  • 2021-11-28
  • 2021-05-28
  • 2022-12-23
  • 2022-12-23
  • 2021-10-27
猜你喜欢
  • 2022-12-23
  • 2021-09-05
  • 2021-10-30
  • 2022-02-22
  • 2021-09-23
相关资源
相似解决方案