public class EntrySpecification extends AbstractSpecification {
private final EntryCriteria criteria;
public EntrySpecification(EntryCriteria criteria) {
this.criteria = criteria;
}
@Override
public Predicate toPredicate(Root root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate predicate = cb.conjunction();
query.distinct(true);
List<Expression> expressions = predicate.getExpressions();
if (null != criteria.getProjectId()) {
expressions.add(cb.equal(root.get(Entry_.nature).get(Nature_.project).get(Project_.id),
criteria.getProjectId()));
}
if (null != criteria.getNatureIds() && criteria.getNatureIds().size() > 0) {
expressions
.add(cb.isTrue(root.get(Entry_.nature).get(Nature_.id).in(criteria.getNatureIds())));
}
if (isNotBlank(criteria.getNaturePrefix())) {
expressions.add(cb.like(cb.lower(root.get(Entry_.nature).get(Nature_.name)),
wildcardEndAndLower(criteria.getNaturePrefix())));
}
if (isNotBlank(criteria.getNature())) {
expressions.add(cb.or(
cb.like(cb.lower(root.get(Entry_.nature).get(Nature_.name)),
wildcardsAndLower(criteria.getNature())),
cb.like(cb.lower(root.get(Entry_.nature).get(Nature_.description)),
wildcardsAndLower(criteria.getNature()))
)
);
}
if (isNotBlank(criteria.getWord())) {
expressions.add(cb.or(
cb.like(cb.lower(root.get(Entry_.word)), wildcardsAndLower(criteria.getWord())),
cb.like(cb.lower(root.join(Entry_.synonyms, JoinType.LEFT)), wildcardsAndLower(criteria.getWord()))
)
);
}
if (isNotBlank(criteria.getFilter())) {
expressions.add(cb.or(
cb.like(cb.lower(root.get(Entry_.word)), wildcardsAndLower(criteria.getFilter())),
cb.like(cb.lower(root.join(Entry_.synonyms, JoinType.LEFT)), wildcardsAndLower(criteria.getFilter())),
cb.like(cb.lower(root.get(Entry_.nature).get(Nature_.name)),
wildcardsAndLower(criteria.getFilter())),
cb.like(cb.lower(root.get(Entry_.nature).get(Nature_.description)),
wildcardsAndLower(criteria.getFilter()))
)
);
}
return predicate;
}
}
注:jpa默认的多表连接为inner join,可添加JoinType.LEFT来改变连接方式