BaseController.java 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package com.izouma.awesomeAdmin.web;
  2. import com.izouma.awesomeAdmin.annotations.Searchable;
  3. import com.izouma.awesomeAdmin.dto.PageQuery;
  4. import org.apache.commons.lang3.StringUtils;
  5. import org.springframework.data.domain.PageRequest;
  6. import org.springframework.data.domain.Sort;
  7. import org.springframework.data.jpa.domain.Specification;
  8. import javax.persistence.criteria.Predicate;
  9. import java.lang.reflect.Field;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. public class BaseController {
  13. public PageRequest toPageRequest(PageQuery pageQuery) {
  14. PageRequest pageRequest;
  15. if (StringUtils.isNotEmpty(pageQuery.getSort())) {
  16. List<Sort.Order> orders = new ArrayList<>();
  17. for (String sortStr : pageQuery.getSort().split(";")) {
  18. String direction = "asc";
  19. String prop = sortStr;
  20. if (sortStr.contains(",asc") || sortStr.contains(",desc")) {
  21. prop = sortStr.split(",")[0];
  22. direction = sortStr.split(",")[1];
  23. }
  24. orders.add("asc".equals(direction) ? Sort.Order.asc(prop) : Sort.Order.desc(prop));
  25. }
  26. pageRequest = PageRequest.of(pageQuery.getPage(), pageQuery.getSize(), Sort.by(orders));
  27. } else {
  28. pageRequest = PageRequest.of(pageQuery.getPage(), pageQuery.getSize());
  29. }
  30. return pageRequest;
  31. }
  32. public <T> Specification<T> toSpecification(PageQuery pageQuery, Class queryClass) {
  33. return (Specification<T>) (root, criteriaQuery, criteriaBuilder) -> {
  34. List<Predicate> and = new ArrayList<>();
  35. pageQuery.getQuery().forEach((property, value) -> {
  36. if (value == null) {
  37. return;
  38. }
  39. if (String.class.equals(value.getClass())) {
  40. if (StringUtils.isEmpty((String) value)) {
  41. return;
  42. }
  43. }
  44. and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), value)));
  45. });
  46. if (StringUtils.isNotEmpty(pageQuery.getSearch())) {
  47. Field[] fields = queryClass.getDeclaredFields();
  48. List<Predicate> or = new ArrayList<>();
  49. try {
  50. or.add(criteriaBuilder.equal(root.get("id"), pageQuery.getSearch()));
  51. } catch (Exception e) {
  52. }
  53. for (Field field : fields) {
  54. Searchable annotation = field.getAnnotation(Searchable.class);
  55. if (annotation == null) {
  56. continue;
  57. }
  58. if (!annotation.value()) {
  59. continue;
  60. }
  61. or.add(criteriaBuilder.like(root.get(field.getName()), "%" + pageQuery.getSearch() + "%"));
  62. }
  63. and.add(criteriaBuilder.or(or.stream().toArray(Predicate[]::new)));
  64. }
  65. return criteriaBuilder.and(and.stream().toArray(Predicate[]::new));
  66. };
  67. }
  68. }