我有一节课有很多“如果不是”。我不知道如何重构它。我想工厂模式,但我不知道如何实现它。有人帮我吗?
@Override
public Predicate toPredicate(@NotNull Root<E> root, @NotNull CriteriaQuery<?> cq, @NotNull CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
for (SearchCriteria criteria : criteriaList) {
if (criteria.getValue() == null) {
predicates.add(cb.isTrue(cb.literal(true)));
} else if (criteria.getOperation().equals(GREATER_THAN)) {
predicates.add(cb.greaterThan(root.get(criteria.getKey()).as(criteria.getKey().getClass()), criteria.getValue().toString()));
} else if (criteria.getOperation().equals(LESS_THAN)) {
predicates.add(cb.lessThan(root.get(criteria.getKey()).as(criteria.getKey().getClass()), criteria.getValue().toString()));
} else if (criteria.getOperation().equals(GREATER_THAN_EQUAL)) {
predicates.add(cb.greaterThanOrEqualTo(root.get(criteria.getKey()).as(criteria.getKey().getClass()), criteria.getValue().toString()));
} else if (criteria.getOperation().equals(LESS_THAN_EQUAL)) {
predicates.add(cb.lessThanOrEqualTo(root.get(criteria.getKey()).as(criteria.getKey().getClass()), criteria.getValue().toString()));
} else if (criteria.getOperation().equals(NOT_EQUAL)) {
predicates.add(cb.notEqual(root.get(criteria.getKey()).as(criteria.getKey().getClass()), criteria.getValue()));
} else if (criteria.getOperation().equals(EQUAL)) {
predicates.add(cb.equal(root.get(criteria.getKey()).as(criteria.getKey().getClass()), criteria.getValue()));
} else if (criteria.getOperation().equals(MATCH)) {
predicates.add(cb.like(cb.lower(root.get(criteria.getKey())), "%" + criteria.getValue().toString().toLowerCase() + "%"));
} else if (criteria.getOperation().equals(MATCH_END)) {
predicates.add(cb.like(cb.lower(root.get(criteria.getKey())), criteria.getValue().toString().toLowerCase() + "%"));
} else if (criteria.getOperation().equals(MATCH_START)) {
predicates.add(cb.like(cb.lower(root.get(criteria.getKey())), "%" + criteria.getValue().toString().toLowerCase()));
} else if (criteria.getOperation().equals(IN)) {
predicates.add(cb.in(root.get(criteria.getKey())).value(criteria.getValue()));
} else if (criteria.getOperation().equals(NOT_IN)) {
predicates.add(cb.not(root.get(criteria.getKey())).in(criteria.getValue()));
}
}
return cb.and(predicates.toArray(Predicate[]::new));
}
2条答案
按热度按时间7fyelxc51#
工厂模式是一种创造性的模式。因此,它用于构造一个对象,不同的用途之间需要存在一些公共接口。这并不直接适用于你的案子。
假设您可以编辑criteriabuilder,则可以执行以下操作:
(可选)更换
criteria.getOperation()
,criteria.getKey()
,criteria.value()
带局部变量op
,key
以及value
使代码更具可读性。更新
CriteriaBuilder
公开一个方法,比如build(root, key, value, op)
并将如何构建每个标准的代码移到这个方法中。在你的
toPredicate()
,你可以简单地predicates.add(cb.build(root, key, value, op))
.你可能会说,这种方法只会让巨人陷入困境
cb.build()
方法;然而,这离更清晰的代码又近了一步。cb.build()
基本上是您正在寻找的工厂方法,以及调用者(toPredicate()
)不必知道建立标准的逻辑。您可以继续改进if-else逻辑
cb.build()
因为您可以直接访问CriteriaBuilder
. 如果不了解代码,很难判断下一步是什么CriteriaBuilder
.um6iljoc2#
写
SearchCriteria.java
接口,类似于:而不是编写将实现此接口的标准类,例如:
发射型计算机断层扫描仪。
而不是写
PredicateFactory.java
类,该类封装用于基于搜索条件创建 predicate 对象的逻辑。最后,在foor循环中使用这个工厂类: