From d3673e3af342335f86309839d7325ee84f42147e Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Wed, 23 Aug 2023 21:44:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/lihongjie/coal/dto/CommonQuery.java | 120 +++++++++--------- 1 file changed, 61 insertions(+), 59 deletions(-) diff --git a/src/main/java/cn/lihongjie/coal/dto/CommonQuery.java b/src/main/java/cn/lihongjie/coal/dto/CommonQuery.java index d22ea54e..6b18d0dc 100644 --- a/src/main/java/cn/lihongjie/coal/dto/CommonQuery.java +++ b/src/main/java/cn/lihongjie/coal/dto/CommonQuery.java @@ -1,5 +1,6 @@ package cn.lihongjie.coal.dto; +import cn.lihongjie.coal.exception.BizException; import io.vavr.Function4; import io.vavr.Tuple; import io.vavr.Tuple2; @@ -9,7 +10,9 @@ import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; import jakarta.persistence.metamodel.Attribute; import jakarta.persistence.metamodel.EntityType; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.With; import org.apache.commons.collections4.CollectionUtils; import org.springframework.core.convert.ConversionService; import org.springframework.data.domain.Sort; @@ -33,7 +36,7 @@ public class CommonQuery { private List orders; @Data - public static class Order{ + public static class Order { private final Sort.Direction direction; private final String property; @@ -54,6 +57,8 @@ public class CommonQuery { } @Data + @With + @AllArgsConstructor public static class QueryItem { private String key; private String opt; @@ -65,10 +70,7 @@ public class CommonQuery { } - - - - public static Map, Function4> map = new HashMap<>(); + public static Map, Function4> map = new HashMap<>(); static { @@ -83,7 +85,6 @@ public class CommonQuery { }); - map.put(Tuple.of("null", String.class), (Root root, CriteriaBuilder criteriaBuilder, QueryItem x, ConversionService c) -> { return criteriaBuilder.isNull(root.get(x.key)); }); @@ -112,7 +113,6 @@ public class CommonQuery { }); - map.put(Tuple.of("nnull", String.class), (Root root, CriteriaBuilder criteriaBuilder, QueryItem x, ConversionService c) -> { return criteriaBuilder.isNotNull(root.get(x.key)); }); @@ -141,7 +141,6 @@ public class CommonQuery { }); - map.put(Tuple.of("eq", String.class), (Root root, CriteriaBuilder criteriaBuilder, QueryItem x, ConversionService c) -> { return criteriaBuilder.equal(root.get(x.key), c.convert(x.value, String.class)); }); @@ -170,10 +169,6 @@ public class CommonQuery { }); - - - - map.put(Tuple.of("neq", String.class), (Root root, CriteriaBuilder criteriaBuilder, QueryItem x, ConversionService c) -> { return criteriaBuilder.notEqual(root.get(x.key), c.convert(x.value, String.class)); }); @@ -202,10 +197,6 @@ public class CommonQuery { }); - - - - map.put(Tuple.of("between", String.class), (Root root, CriteriaBuilder criteriaBuilder, QueryItem x, ConversionService c) -> { return criteriaBuilder.between(root.get(x.key), c.convert(x.min, String.class), c.convert(x.max, String.class)); }); @@ -234,15 +225,6 @@ public class CommonQuery { }); - - - - - - - - - map.put(Tuple.of("lt", String.class), (Root root, CriteriaBuilder criteriaBuilder, QueryItem x, ConversionService c) -> { return criteriaBuilder.lessThan(root.get(x.key), c.convert(x.value, String.class)); }); @@ -299,13 +281,6 @@ public class CommonQuery { }); - - - - - - - map.put(Tuple.of("gt", String.class), (Root root, CriteriaBuilder criteriaBuilder, QueryItem x, ConversionService c) -> { return criteriaBuilder.greaterThan(root.get(x.key), c.convert(x.value, String.class)); }); @@ -377,20 +352,6 @@ public class CommonQuery { }); - - - - - - - - - - - - - - map.put(Tuple.of("in", String.class), (Root root, CriteriaBuilder criteriaBuilder, QueryItem x, ConversionService c) -> { return criteriaBuilder.in(root.get(x.key)).in(Arrays.stream(x.value.split(",")).map(i -> c.convert(i, String.class)).toList()); }); @@ -419,9 +380,6 @@ public class CommonQuery { }); - - - map.put(Tuple.of("nin", String.class), (Root root, CriteriaBuilder criteriaBuilder, QueryItem x, ConversionService c) -> { return criteriaBuilder.in(root.get(x.key)).in(Arrays.stream(x.value.split(",")).map(i -> c.convert(i, String.class)).toList()).not(); }); @@ -450,17 +408,12 @@ public class CommonQuery { }); - - - } public Specification specification(ConversionService conversionService) { - - return new Specification() { @Override public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) { @@ -499,18 +452,67 @@ public class CommonQuery { private static Predicate getPredicate(Root root, CriteriaBuilder criteriaBuilder, QueryItem x, ConversionService conversionService) { EntityType entityType = root.getModel(); + Attribute attribute = entityType.getAttribute(x.key); + switch (attribute.getPersistentAttributeType()) { + + case BASIC -> { + + + Class javaType = attribute.getJavaType(); + + + Function4 function4 = map.get(Tuple.of(x.opt, javaType)); + + if (function4 == null) { + throw new RuntimeException("无法识别的查询 " + x); + } + + return function4.apply(root, criteriaBuilder, x, conversionService); + } + case ONE_TO_ONE -> { + + + Function4 function4 = map.get(Tuple.of(x.opt, attribute.getJavaType())); + + if (function4 == null) { + throw new RuntimeException("无法识别的查询 " + x); + } + + return function4.apply(root, criteriaBuilder, x.withKey(x.getKey() + "." + "id"), conversionService); + + + } + case MANY_TO_ONE -> { + + + Function4 function4 = map.get(Tuple.of(x.opt, attribute.getJavaType())); + + if (function4 == null) { + throw new RuntimeException("无法识别的查询 " + x); + } + + return function4.apply(root, criteriaBuilder, x.withKey(x.getKey() + "." + "id"), conversionService); + + + } + + + default -> { + throw new BizException("不支持的持久化类型查询 " + attribute.getPersistentAttributeType()); + } + + + + - Class javaType = attribute.getJavaType(); - Function4 function4 = map.get(Tuple.of(x.opt, javaType)); - if (function4 == null) { - throw new RuntimeException("无法识别的查询 " + x); } - return function4.apply(root, criteriaBuilder, x, conversionService); + +