公司使用 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 pageable = PageRequest.of(page - 1, limit, Sort.Direction.DESC,
"updatedTime");
Specification<FlowTemplateDO> specification = (Specification<FlowTemplateDO>) (
root, query, criteriaBuilder) -> {
List<Predicate> conditions = Lists.newArrayList();
if(!StringUtils.isEmpty(name)){
conditions.add(criteriaBuilder.like(root.get("flowName"), "%" + name + "%"));
}
conditions.add(criteriaBuilder.equal(root.get("del"), 0));
conditions.add(criteriaBuilder.equal(root.get("status"), 0));
return criteriaBuilder.and(Iterables.toArray(conditions, Predicate.class));
};
Page<FlowTemplateDO> flowTempOptional = flowTemplateRepository
.findAll(specification, pageable);
return new PageDataDO<>(flowTempOptional.getTotalElements(),
flowTempOptional.getContent());
}
好了这就是jpa多条见查询,其实要是业务特别复杂的话,还是要通过sql进行,比如要关联20多张表,拼接30多种条件的话要是这样通过代码去拼接那就太头大了,所以有时间感觉jpa挺坑,但是如果是一些简单查询还是可以应用的,而且效率很高,其实个人感觉做项目完全可以配置多数据源将jpa,与mybaties进行联合使用,这样效率,扩展性也许会强一些,今天分享的其他很简单,但是如果用jpa做项目是应用率应该很高,希望可以帮到大家,喜欢研究jpa,也可以多试一试jpa中封装的方法,可能还会有更好的方式。