Jpa 使用Specification构建复杂查询
JPA and中添加or查询条件
eg: 查询当前用户支付状态为1,任务运行状态为1或0的所有任务信息。
sql: select * from task where user_id=1 and billing_status=1 and status=1 or 0
怎样将查询条件封装到jpa的查询对象中呢?
public List<EmailGradeTask> findTaskByUserIdAndStatusAndBillingStatus(Integer userId){
List<EmailGradeTask> gradeTaskList = emailGradeTaskRepository.findAll(new Specification<EmailGradeTask>() {
@Nullable
@Override
public Predicate toPredicate(Root<EmailGradeTask> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder
criteriaBuilder) {
//封装and查询条件
List<Predicate> list = new ArrayList<>();
list.add(criteriaBuilder.equal(root.get("userId"), userId));
list.add(criteriaBuilder.equal(root.get("billingStatus"), "1"));
Predicate[] predicates = new Predicate[list.size()];
Predicate predicateWhere = criteriaBuilder.and(list.toArray(predicates));
//封装or查询条件
List<Predicate> listPermission = new ArrayList<>();
listPermission.add(criteriaBuilder.equal(root.get("status"), 1));
listPermission.add(criteriaBuilder.equal(root.get("status"), 0));
Predicate[] predicatesPermissionArr = new Predicate[listPermission.size()];
Predicate predicatesPermission = criteriaBuilder.or(listPermission.toArray(predicatesPermissionArr));
//两条件合并
Predicate restriction = criteriaQuery.where(predicateWhere, predicatesPermission).getRestriction();
return restriction;
}
});
return gradeTaskList;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~