JPA如何根据前台传的多个参数(有的有值,有的没有值),进行like、equals等复杂,动态查询数据
主要使用以下几个类
SpecificationPredicateCriteriaQueryCriteriaBuilderPagingAndSortingRepositoryJpaSpecificationExecutor
1.代码
1-1.entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name
= "T_MGR_PROJECT_WORKFLOW" , catalog
= "iworkh_java")
public class ProjectWorkFlow {
@Id
@Column(name
= "WF_ID")
private String wfId
;
@Column(name
= "WF_NAME",nullable
= true, length
= 200)
private String wfName
;
@Column(name
= "PROJECT_ID",nullable
= true, length
= 200)
private String projectId
;
....
}
1-2.repository
public interface ProjectWorkFlowRepository extends
PagingAndSortingRepository<ProjectWorkFlow, String>,
JpaSpecificationExecutor
<ProjectWorkFlow> {
}
注意:这必须要继承类PagingAndSortingRepository和JpaSpecificationExecutor
1-3.service
public class JobWorkflowService {
@Autowired
ProjectWorkFlowRepository projectWorkFlowRepository
;
public Page
<ProjectWorkFlow> getJobWorkflowListByPage(WorkflowQueryData
.QueryData queryData
, Pageable pageable
){
Specification specificationQuery
= new Specification<ProjectWorkFlow>() {
@Override
public Predicate
toPredicate(Root
<ProjectWorkFlow> root
, CriteriaQuery
<?> criteriaQuery
, CriteriaBuilder criteriaBuilder
) {
List
<Predicate> list
= new ArrayList<>();
if (StringUtils
.isNoneBlank(queryData
.getWfName())) {
Path
<String> wfNamePath
= root
.get("wfName");
Predicate wfNameLike
= criteriaBuilder
.like(wfNamePath
, "%"+queryData
.getWfName()+"%");
list
.add(criteriaBuilder
.and(wfNameLike
));
}
if (StringUtils
.isNoneBlank(queryData
.getProjectId())) {
Path
<String> projectIdPath
= root
.get("projectId");
Predicate projectIdEqual
= criteriaBuilder
.equal(projectIdPath
, queryData
.getProjectId());
list
.add(criteriaBuilder
.and(projectIdEqual
));
}
Predicate
[] p
= new Predicate[list
.size()];
return criteriaBuilder
.and(list
.toArray(p
));
}
};
Page
<ProjectWorkFlow> pageRows
=projectWorkFlowRepository
.findAll(specificationQuery
, pageable
);
return pageRows
;
}
}
2.方法介绍
2-1.toPredicate
public Predicate
toPredicate(Root
<DevWarnPo> root
, CriteriaQuery
<?> criteriaQuery
, CriteriaBuilder criteriaBuilder
)
CriteriaQuery<?> criteriaQuery
这是一个面向对象查询,代表的是Specific的顶层查询对象, 它包含查询的各个部分:select,from,where,group by, order by等,不过它是一个面向对象的查询方式,只对实体类型,嵌入式类型的Criteria查询起作用。
Root<T> root
代表要查询的对象,也就是实体类型,实体类型好比sql语句中的from后的表。传入实体类型后,会被CriteriaQuery的父类AbstractQuery.from将实体类型传入
CriterBuilder criteriaBuilder
用来构建CriteriaQuery的构建器对象Predicate(谓语),即:一个简单或者复杂的谓语类型,相当于条件或者多条件集合。
Predicate
就是多条件查询中的条件,可以通过List 实现多个条件操作。
3.推荐
个人博客
能读到文章最后,首先得谢谢您对本文的肯定,你的肯定是对博主最大的鼓励。
你觉本文有帮助,那就点个👍 你有疑问,那就留下您的💬 怕把我弄丢了,那就把我⭐ 电脑不方便看,那就把发到你📲