1. and
build.conjunction()
Specification<ApplicationEntity> specification = (root, query, build) -> {
Predicate predicate = build.conjunction();
if (ObjectUtil.isNotNull(applicationTypeEnum)) {
predicate.getExpressions().add(build.equal(root.get("appType"), applicationTypeEnum.getCode()));
}
if (ObjectUtil.isNotNull(dataItemStatus)) {
predicate.getExpressions().add(build.equal(root.get("status"), dataItemStatus));
}
return predicate;
};
return applicationRepository.findAll(specification);
2. or
builder.disjunction()
// 构建搜索条件(编码所有的都不能重复,路由是每个应用下不能重复) or
Specification<MenuEntity> specification = (root, query, builder) -> {
Predicate predicate = builder.disjunction();
if (StrUtil.isNotBlank(param.getRouter())) {
predicate.getExpressions().add(builder.and(
builder.equal(root.get("applicationId"), param.getApplicationId()),
builder.equal(root.get("router"), param.getRouter())
));
}
if (StrUtil.isNotBlank(code)) {
predicate.getExpressions().add(builder.equal(root.get("code"), code));
}
return CollUtil.isEmpty(predicate.getExpressions()) ? null : predicate;
};
MenuEntity one = menuDao.getRepository().findOne(specification).orElse(null);
注意:如果没有添加任何条件到
disjunction
中,Hibernate
会自动地添加一个始终为false
的条件。这将导致生成的 SQL 语句类似于WHERE (0=1)
,这样的查询永远不会返回任何结果。为了避免这种情况,你需要确保至少添加一个条件到你的逻辑或 (OR
) 的谓词中或者像上面一样返回null
3. 自由组合
// 构建搜索条件
Specification<AssetModelRelEntity> specification = (root, query, build) -> {
// 定义条件谓词列表
List<Predicate> predicates = new ArrayList<>();
if (CollUtil.isNotEmpty(modelIds)) {
predicates.add(build.or(
build.in(root.get("sourceModelId")).value(modelIds),
build.in(root.get("targetModelId")).value(modelIds)
));
}
if (CollUtil.isNotEmpty(userIds)) {
predicates.add(build.in(root.get("createBy")).value(userIds));
}
return CollUtil.isEmpty(predicates) ? null : build.or(predicates.toArray(new Predicate[0]));
};
最后是
build.or()
,如果没有至少一个条件永远成立,还需要判断一下