|
|
@@ -48,114 +48,13 @@ public class BaseController {
|
|
|
return pageRequest;
|
|
|
}
|
|
|
|
|
|
- public static <T> Specification<T> toSpecification(PageQuery pageQuery, Class queryClass) {
|
|
|
+ public static <T> Specification<T> toSpecification(PageQuery pageQuery, Class<T> queryClass) {
|
|
|
return toSpecification(pageQuery, queryClass, null);
|
|
|
}
|
|
|
|
|
|
public static <T> Specification<T> toSpecification(PageQuery pageQuery, Class<T> queryClass, BaseController.CustomSearch<T> customSearch) {
|
|
|
return (Specification<T>) (root, criteriaQuery, criteriaBuilder) -> {
|
|
|
- List<Predicate> and = new ArrayList<>();
|
|
|
- pageQuery.getQuery().forEach((property, value) -> {
|
|
|
- if (value == null) {
|
|
|
- return;
|
|
|
- }
|
|
|
- if (String.class.equals(value.getClass())) {
|
|
|
- if (StringUtils.isEmpty((String) value)) {
|
|
|
- return;
|
|
|
- }
|
|
|
- if ("true".equals(value) || "false".equals(value)) {
|
|
|
- and.add(criteriaBuilder
|
|
|
- .and(criteriaBuilder.equal(root.get(property), Boolean.valueOf((String) value))));
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
- if (property.equals("createdAt") && !StringUtils.isEmpty(value.toString())) {
|
|
|
- DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
- and.add(criteriaBuilder.between(root.get(property), LocalDateTime
|
|
|
- .parse(value.toString().split(",")[0], df), LocalDateTime
|
|
|
- .parse(value.toString().split(",")[1], df)));
|
|
|
- } else {
|
|
|
- try {
|
|
|
- Field field = queryClass.getDeclaredField(property);
|
|
|
- Class fieldType = field.getType();
|
|
|
- if (Enum.class.isAssignableFrom(fieldType)) {
|
|
|
- if (value instanceof Collection) {
|
|
|
- if (!((Collection) value).isEmpty()) {
|
|
|
- List list = new ArrayList();
|
|
|
- for (Object o : ((Collection) value)) {
|
|
|
- list.add(Enum.valueOf(fieldType, String.valueOf(o)));
|
|
|
- }
|
|
|
- and.add(root.get(property).in(list));
|
|
|
- }
|
|
|
- } else if (value instanceof String && StringUtils.isNotEmpty((String) value)) {
|
|
|
- if (((String) value).contains(",")) {
|
|
|
- String[] arr = ((String) value).split(",");
|
|
|
- List list = new ArrayList();
|
|
|
- for (String s : arr) {
|
|
|
- list.add(Enum.valueOf(fieldType, s));
|
|
|
- }
|
|
|
- and.add(root.get(property).in(list));
|
|
|
- } else {
|
|
|
- and.add(criteriaBuilder.and(criteriaBuilder
|
|
|
- .equal(root.get(property), Enum
|
|
|
- .valueOf(fieldType, String.valueOf(value)))));
|
|
|
- }
|
|
|
- }
|
|
|
- } else if (LocalDateTime.class == fieldType) {
|
|
|
- if (value instanceof List) {
|
|
|
- List list = (List) value;
|
|
|
- if (list.size() == 1) {
|
|
|
- LocalDateTime start = DateTimeUtils
|
|
|
- .toLocalDateTime((String) list.get(0), "yyyy-MM-dd HH:mm:ss");
|
|
|
- and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
|
|
|
- } else if (list.size() == 2) {
|
|
|
- LocalDateTime end = DateTimeUtils
|
|
|
- .toLocalDateTime((String) list.get(1), "yyyy-MM-dd HH:mm:ss");
|
|
|
- and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
|
|
|
- }
|
|
|
- } else if (value instanceof String && Pattern
|
|
|
- .matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$", (String) value)) {
|
|
|
- String[] arr = ((String) value).split(",");
|
|
|
- LocalDateTime start = DateTimeUtils.toLocalDateTime(arr[0], "yyyy-MM-dd HH:mm:ss");
|
|
|
- and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
|
|
|
- LocalDateTime end = DateTimeUtils.toLocalDateTime(arr[1], "yyyy-MM-dd HH:mm:ss");
|
|
|
- and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
|
|
|
- } else {
|
|
|
- and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), DateTimeUtils
|
|
|
- .toLocalDateTime((String) value, "yyyy-MM-dd HH:mm:ss"))));
|
|
|
- }
|
|
|
- } else if (LocalDate.class == fieldType) {
|
|
|
- if (value instanceof List) {
|
|
|
- List list = (List) value;
|
|
|
- if (list.size() == 1) {
|
|
|
- LocalDate start = DateTimeUtils
|
|
|
- .toLocalDate((String) list.get(0), "yyyy-MM-dd");
|
|
|
- and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
|
|
|
- } else if (list.size() == 2) {
|
|
|
- LocalDate end = DateTimeUtils
|
|
|
- .toLocalDate((String) list.get(1), "yyyy-MM-dd");
|
|
|
- and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
|
|
|
- }
|
|
|
- } else if (value instanceof String && Pattern
|
|
|
- .matches("^\\d{4}-\\d{2}-\\d{2},\\d{4}-\\d{2}-\\d{2}$", (String) value)) {
|
|
|
- String[] arr = ((String) value).split(",");
|
|
|
- LocalDate start = DateTimeUtils.toLocalDate(arr[0], "yyyy-MM-dd");
|
|
|
- and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
|
|
|
- LocalDate end = DateTimeUtils.toLocalDate(arr[1], "yyyy-MM-dd");
|
|
|
- and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
|
|
|
- } else {
|
|
|
- and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), DateTimeUtils
|
|
|
- .toLocalDateTime((String) value, "yyyy-MM-dd"))));
|
|
|
- }
|
|
|
- } else {
|
|
|
- and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), value)));
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- });
|
|
|
+ List<Predicate> and = toPredicates(pageQuery, queryClass, root, criteriaQuery, criteriaBuilder);
|
|
|
if (StringUtils.isNotEmpty(pageQuery.getSearch())) {
|
|
|
if (customSearch != null) {
|
|
|
and.add(customSearch.toPredicate(pageQuery.getSearch(), root, criteriaQuery, criteriaBuilder));
|
|
|
@@ -183,4 +82,111 @@ public class BaseController {
|
|
|
return criteriaBuilder.and(and.toArray(new Predicate[0]));
|
|
|
};
|
|
|
}
|
|
|
+
|
|
|
+ public static <T> List<Predicate> toPredicates(PageQuery pageQuery, Class<T> queryClass, Root<T> root,
|
|
|
+ CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
|
|
|
+ List<Predicate> and = new ArrayList<>();
|
|
|
+ pageQuery.getQuery().forEach((property, value) -> {
|
|
|
+ if (value == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (String.class.equals(value.getClass())) {
|
|
|
+ if (StringUtils.isEmpty((String) value)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if ("true".equals(value) || "false".equals(value)) {
|
|
|
+ and.add(criteriaBuilder
|
|
|
+ .and(criteriaBuilder.equal(root.get(property), Boolean.valueOf((String) value))));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (property.equals("createdAt") && !StringUtils.isEmpty(value.toString())) {
|
|
|
+ DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ and.add(criteriaBuilder.between(root.get(property), LocalDateTime
|
|
|
+ .parse(value.toString().split(",")[0], df), LocalDateTime
|
|
|
+ .parse(value.toString().split(",")[1], df)));
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ Field field = queryClass.getDeclaredField(property);
|
|
|
+ Class fieldType = field.getType();
|
|
|
+ if (Enum.class.isAssignableFrom(fieldType)) {
|
|
|
+ if (value instanceof Collection) {
|
|
|
+ if (!((Collection) value).isEmpty()) {
|
|
|
+ List list = new ArrayList();
|
|
|
+ for (Object o : ((Collection) value)) {
|
|
|
+ list.add(Enum.valueOf(fieldType, String.valueOf(o)));
|
|
|
+ }
|
|
|
+ and.add(root.get(property).in(list));
|
|
|
+ }
|
|
|
+ } else if (value instanceof String && StringUtils.isNotEmpty((String) value)) {
|
|
|
+ if (((String) value).contains(",")) {
|
|
|
+ String[] arr = ((String) value).split(",");
|
|
|
+ List list = new ArrayList();
|
|
|
+ for (String s : arr) {
|
|
|
+ list.add(Enum.valueOf(fieldType, s));
|
|
|
+ }
|
|
|
+ and.add(root.get(property).in(list));
|
|
|
+ } else {
|
|
|
+ and.add(criteriaBuilder.and(criteriaBuilder
|
|
|
+ .equal(root.get(property), Enum
|
|
|
+ .valueOf(fieldType, String.valueOf(value)))));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (LocalDateTime.class == fieldType) {
|
|
|
+ if (value instanceof List) {
|
|
|
+ List list = (List) value;
|
|
|
+ if (list.size() == 1) {
|
|
|
+ LocalDateTime start = DateTimeUtils
|
|
|
+ .toLocalDateTime((String) list.get(0), "yyyy-MM-dd HH:mm:ss");
|
|
|
+ and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
|
|
|
+ } else if (list.size() == 2) {
|
|
|
+ LocalDateTime end = DateTimeUtils
|
|
|
+ .toLocalDateTime((String) list.get(1), "yyyy-MM-dd HH:mm:ss");
|
|
|
+ and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
|
|
|
+ }
|
|
|
+ } else if (value instanceof String && Pattern
|
|
|
+ .matches("^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$", (String) value)) {
|
|
|
+ String[] arr = ((String) value).split(",");
|
|
|
+ LocalDateTime start = DateTimeUtils.toLocalDateTime(arr[0], "yyyy-MM-dd HH:mm:ss");
|
|
|
+ and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
|
|
|
+ LocalDateTime end = DateTimeUtils.toLocalDateTime(arr[1], "yyyy-MM-dd HH:mm:ss");
|
|
|
+ and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
|
|
|
+ } else {
|
|
|
+ and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), DateTimeUtils
|
|
|
+ .toLocalDateTime((String) value, "yyyy-MM-dd HH:mm:ss"))));
|
|
|
+ }
|
|
|
+ } else if (LocalDate.class == fieldType) {
|
|
|
+ if (value instanceof List) {
|
|
|
+ List list = (List) value;
|
|
|
+ if (list.size() == 1) {
|
|
|
+ LocalDate start = DateTimeUtils
|
|
|
+ .toLocalDate((String) list.get(0), "yyyy-MM-dd");
|
|
|
+ and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
|
|
|
+ } else if (list.size() == 2) {
|
|
|
+ LocalDate end = DateTimeUtils
|
|
|
+ .toLocalDate((String) list.get(1), "yyyy-MM-dd");
|
|
|
+ and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
|
|
|
+ }
|
|
|
+ } else if (value instanceof String && Pattern
|
|
|
+ .matches("^\\d{4}-\\d{2}-\\d{2},\\d{4}-\\d{2}-\\d{2}$", (String) value)) {
|
|
|
+ String[] arr = ((String) value).split(",");
|
|
|
+ LocalDate start = DateTimeUtils.toLocalDate(arr[0], "yyyy-MM-dd");
|
|
|
+ and.add(criteriaBuilder.greaterThanOrEqualTo(root.get(property), start));
|
|
|
+ LocalDate end = DateTimeUtils.toLocalDate(arr[1], "yyyy-MM-dd");
|
|
|
+ and.add(criteriaBuilder.lessThanOrEqualTo(root.get(property), end));
|
|
|
+ } else {
|
|
|
+ and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), DateTimeUtils
|
|
|
+ .toLocalDateTime((String) value, "yyyy-MM-dd"))));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), value)));
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return and;
|
|
|
+ }
|
|
|
}
|