基础用法参考:
Spring Data Specification基础用法
这里分享一下子查询的简单用法
Specification<SmsParam> specification = (Root<SmsParam> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {
Predicate p = cb.conjunction();
if (!"".equals(paramName) && null != paramName) {
Predicate p1 = cb.like(root.get("paramZhName").as(String.class), "%" + paramName + "%");
Predicate p2 = cb.like(root.get("paramEnName").as(String.class), "%" + paramName + "%");
p = cb.and(p, cb.or(p1, p2));
}
if (!"".equals(paramState) && null != paramState) {
Predicate p1 = cb.equal(root.get("paramState").as(String.class), paramState);
p = cb.and(p, p1);
}
if (!"".equals(paramSource) && null != paramSource) {
Predicate p1 = cb.equal(root.get("paramSource").as(String.class), paramSource);
p = cb.and(p, p1);
}
//创建子查询 这里偷懒子查询使用了同一张表
Subquery<SmsParam> subquery = query.subquery(SmsParam.class);
//子查询 要查询哪个实体
Root<SmsParam> subRoot = subquery.from(SmsParam.class);
//子查询要查询哪个字段
subquery = subquery.select(subRoot.get("paramState"));
//将子查询与父查询和到一起
p = cb.and(p, root.get("paramState").in(subquery));
return query.where(p).getRestriction();
};