SpringDataJPA中使用Specification进行表多条件分页动态查询

    公司使用 SpringDataJPA进行项目开发,个人感觉jpa挺坑的,但是如果业务不是特别复杂的话使用起来确实很方便,话不多说,今天分享下SpringDataJPA中使用Specification如何实现多条件分页动态查询
    用过jpa的都知道,jpa是可以实现让程序员不关心手写sql,只需要关心业务就可以,所以jpa完全可以抛弃手写sql,在代码层面对数据库进行多条件分页查询,今天就不聊SpringDataJPA的整合配置了,因为大家可以通过其他博客查找到,这里只聊应用

1.实体类

    		使用jpa实体类时关键,它对应了你要在数据库所自动生成的表
@Data
@Entity
@DynamicInsert
@Table(name = "FLOW_TEMPLATE")
public class FlowTemplateDO {

    @Id
    private String id;

    @Column(name = "FLOW_NAME", length = 128)
    private String flowName;
 
    @Lob
    @Column(name = "FLOW_CHART", columnDefinition = "CLOB")
    private String flowChart;

    @Column(name = "SOURCE", length = 512)
    private String source;
 
    @Column(name = "STATUS", length = 1)
    private Integer status;
 
    @Column(name = "DEL", length = 1)
    private Integer del;
 
    @Column(name = "CREATED_BY", length = 32)
    private String createdBy;

    @CreationTimestamp
    @Column(name = "CREATED_TIME", updatable = false)
    private LocalDateTime createdTime;
 
    @Column(name = "UPDATED_BY", length = 32)
    private String updatedBy;

    @UpdateTimestamp
    @Column(name = "UPDATED_TIME")
    private LocalDateTime updatedTime;
}

2 Repository类

           有了实体类,还需要Repository类对数据库进行增删改操作
@Repository
public interface FlowTemplateRepository extends JpaRepository<FlowTemplateDO, String>,
        JpaSpecificationExecutor<FlowTemplateDO> {

      因为jpa底层封装了需要直接可以使用的方法,所以Repository类里时完全可以不写任何方法的

3 分页条件查询

       有了实体类就有了表,有了Repository类 就可以对数据库进行操作,那么当表中有一定量的数据时就可以进行分页条件查询了              
 public PageDataDO<FlowTemplateDO> findByFlowNameLike(Integer page, Integer limit,
                                                         String name) {
        //分页可以使用Pageable类,这个类底层通过构造方式创建对象,参数
        //page :起始页  limit:截取长度  sort:排序  String... properties:最后一个参数是组,
        //是排序的字段,字段要与实体类额属性名对应
        Pageable pageable = PageRequest.of(page - 1, limit, Sort.Direction.DESC,
                "updatedTime");
		//条件拼接可以使用Specification,可以扩展它的内部方法
		// root:是属性集合,就相当于一个map
		// query:它可以进行groupBy,having,where,distinct等等一系列操作
		//criteriaBuilder:是进行条件拼接的,这里面有很多方法,例如like,equal,between
		//还包括一些函数avg,max
        Specification<FlowTemplateDO> specification = (Specification<FlowTemplateDO>) (
                root, query, criteriaBuilder) -> {
            //Predicate类的集合可以进行and拼接,也是我最常用的方法
            List<Predicate> conditions = Lists.newArrayList();
            if(!StringUtils.isEmpty(name)){
               //root.get("***")可以获取属性
                conditions.add(criteriaBuilder.like(root.get("flowName"), "%" + name + "%"));
            }
            conditions.add(criteriaBuilder.equal(root.get("del"), 0));
            conditions.add(criteriaBuilder.equal(root.get("status"), 0));
            //拼接完条件后将所有条件进行返回,交给jpa进行最后整合
            return criteriaBuilder.and(Iterables.toArray(conditions, Predicate.class));
        };
		//这里才是对数据库的操作,jpa通过specification,pageable进行sql整合
		//整合完后再操作数据库,进行数据查询
        Page<FlowTemplateDO> flowTempOptional = flowTemplateRepository
                .findAll(specification, pageable);
                
        //PageDataDO是我自己封装的,完全是配合公司代码规范
        return new PageDataDO<>(flowTempOptional.getTotalElements(),
                flowTempOptional.getContent());
    }
	好了这就是jpa多条见查询,其实要是业务特别复杂的话,还是要通过sql进行,比如要关联20多张表,拼接30多种条件的话要是这样通过代码去拼接那就太头大了,所以有时间感觉jpa挺坑,但是如果是一些简单查询还是可以应用的,而且效率很高,其实个人感觉做项目完全可以配置多数据源将jpa,与mybaties进行联合使用,这样效率,扩展性也许会强一些,今天分享的其他很简单,但是如果用jpa做项目是应用率应该很高,希望可以帮到大家,喜欢研究jpa,也可以多试一试jpa中封装的方法,可能还会有更好的方式。

你可能感兴趣的:(SpringDataJPA中使用Specification进行表多条件分页动态查询)