【发布时间】:2020-08-20 10:24:54
【问题描述】:
我有一堂有很多“if else”的课。我不知道如何重构它。我想到了工厂模式,但我不知道如何实现它。有人帮我吗?
@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));
}
【问题讨论】:
-
看起来你可以使用 switch 语句。
-
我想使用一个模式。
-
你可以在操作对象中添加一个构造谓词的方法,这样你最终会做一些类似 predicates.add(criteria.getOperation().createPredicate(root, criteria)) 的事情,只剩下特殊情况会成为你的第一个测试 null 的 if 语句。
标签: java spring-boot design-patterns spring-data-jpa