spring jpa function(函数) FIND_IN_SET 复杂查询
需求查询当前部门及子部门数据环境说明数据库 部门字段: department_id字段内容:1,2,3,4,5,6,7,8,9,10需要查询的内容:7,8,9,10spring jpa function 代码Specification<DepartmentEntity> specification = new Specification<DepartmentEntity>(
·
需求
查询当前部门及子部门数据
环境说明
数据库 部门字段: department_id
字段内容:1,2,3,4,5,6,7,8,9,10
需要查询的内容:7,8,9,10
spring jpa function 代码
Specification<DepartmentEntity> specification = new Specification<DepartmentEntity>() {
@Override
public Predicate toPredicate(Root<DepartmentEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
List<Predicate> list = Lists.newArrayList();
list.add(cb.equal(root.get("tenantId"), user.getTenantId()));
List<Predicate> or = Lists.newArrayList();
for (String id : departmentList.get()) {
Expression<String> findInSetFun = cb.function("FIND_IN_SET", String.class, cb.literal(id), root.get("departmentId"));
//设置条件 只要返回值 >0 则说明该参数存在于目标字符串中
or.add(cb.notEqual(findInSetFun, "0"));
}
return cb.and(list.toArray(new Predicate[list.size()]));
}
};
最后生成的sql 如下
selectl * FROM department where tenantId="1" AND (
FIND_IN_SET(7,department_id) or
FIND_IN_SET(8,department_id) or
FIND_IN_SET(9,department_id) or
FIND_IN_SET(10,department_id)
)
完整案例
DepartmentEntity 实体
@Data
public class DepartmentEntity implements Serializable {
private String id;
/**
* 租户id
*/
private String tenantId;
/**
* 名称;
*/
private String name;
/**
* 上级id;
*/
private String parentId;
private LocalDateTime createTime;
}
查询 代码
//当前页,
int page = ct.getPage();
//如果是-1 ,则从 0 开始
page = Math.max(page, 0);
//页码 从 0 开始
if (page > 0) {
page = page - 1;
}
// 每页条数
int pageSize = 20;
log.info("page={}", page);
log.info("pageSize={}", pageSize);
//排序 createTime 倒序
Sort sort = Sort.by(new Sort.Order(Sort.Direction.DESC, "createTime"));
//Sort sort = Sort.by(new Sort.Order(Sort.Direction.DESC, "createTime"),new Sort.Order(Sort.Direction.DESC, "uid"));
//分页
Pageable pageable = PageRequest.of(page, pageSize, sort);
log.info("pageable={}", pageable);
//
Specification<DepartmentEntity> specification = new Specification<DepartmentEntity>() {
@Override
public Predicate toPredicate(Root<DepartmentEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
List<Predicate> list = Lists.newArrayList();
list.add(cb.equal(root.get("tenantId"), user.getTenantId()));
List<Predicate> or = Lists.newArrayList();
for (String id : departmentList.get()) {
Expression<String> findInSetFun = cb.function("FIND_IN_SET", String.class, cb.literal(id), root.get("departmentId"));
//设置条件 只要返回值 >0 则说明该参数存在于目标字符串中
or.add(cb.notEqual(findInSetFun, "0"));
}
return cb.and(list.toArray(new Predicate[list.size()]));
}
};
Page<DepartmentEntity> all = departmentDao.findAll(specification, pageable);
log.info("all.getTotalElements={}", all.getTotalElements());
log.info("all.getTotalPages={}", all.getTotalPages());
log.info("all.getSize={}", all.getSize());
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)