DynamicSpecifications.java 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package com.jtgh.yjpt.common;
  2. import java.util.Collection;
  3. import java.util.List;
  4. import javax.persistence.criteria.CriteriaBuilder;
  5. import javax.persistence.criteria.CriteriaQuery;
  6. import javax.persistence.criteria.Path;
  7. import javax.persistence.criteria.Predicate;
  8. import javax.persistence.criteria.Root;
  9. import org.apache.commons.lang3.StringUtils;
  10. import org.springframework.data.jpa.domain.Specification;
  11. import com.google.common.collect.Lists;
  12. @SuppressWarnings({ "rawtypes", "unchecked" })
  13. public class DynamicSpecifications {
  14. public static <T> Specification<T> bySearchFilter(final Collection<SearchFilter> filters,
  15. final Class<T> clazz) {
  16. return new Specification<T>() {
  17. @Override
  18. public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query,
  19. CriteriaBuilder builder) {
  20. if (filters != null && !(filters.isEmpty())) {
  21. List<Predicate> predicates = Lists.newArrayList();
  22. for (SearchFilter filter : filters) {
  23. // nested path translate, 如Task的名为"user.name"的filedName,
  24. // 转换为Task.user.name属性
  25. String[] names = StringUtils.split(filter.fieldName, ".");
  26. Path expression = root.get(names[0]);
  27. for (int i = 1; i < names.length; i++) {
  28. expression = expression.get(names[i]);
  29. }
  30. // logic operator
  31. switch (filter.operator) {
  32. case EQ:
  33. predicates.add(builder.equal(expression, filter.value));
  34. break;
  35. case LIKE:
  36. predicates.add(builder.like(expression, "%" + filter.value + "%"));
  37. break;
  38. case LIKE_L:
  39. predicates.add(builder.like(expression, "%" + filter.value));
  40. break;
  41. case LIKE_R:
  42. predicates.add(builder.like(expression, filter.value + "%"));
  43. break;
  44. case GT:
  45. predicates.add(builder.greaterThan(expression,
  46. (Comparable) filter.value));
  47. break;
  48. case LT:
  49. predicates.add(builder.lessThan(expression, (Comparable) filter.value));
  50. break;
  51. case GTE:
  52. predicates.add(builder.greaterThanOrEqualTo(expression,
  53. (Comparable) filter.value));
  54. break;
  55. case LTE:
  56. predicates.add(builder.lessThanOrEqualTo(expression,
  57. (Comparable) filter.value));
  58. break;
  59. case NL:
  60. predicates.add(builder.isNull(expression));
  61. break;
  62. }
  63. }
  64. // 将所有条件用 and 联合起来
  65. if (predicates.size() > 0) {
  66. return builder.and(predicates.toArray(new Predicate[predicates.size()]));
  67. }
  68. }
  69. return builder.conjunction();
  70. }
  71. };
  72. }
  73. }