jpa实现query查询

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来改变连接方式

猜你喜欢

转载自blog.csdn.net/www_baid_com/article/details/84329151