完善查询

This commit is contained in:
2023-08-23 21:44:28 +08:00
parent 5b29947b3d
commit d3673e3af3

View File

@@ -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<Order> 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<Tuple2<String, Class>, Function4<Root, CriteriaBuilder, QueryItem, ConversionService , Predicate>> map = new HashMap<>();
public static Map<Tuple2<String, Class>, Function4<Root, CriteriaBuilder, QueryItem, ConversionService, Predicate>> 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<Root, CriteriaBuilder, QueryItem, ConversionService, Predicate> 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<Root, CriteriaBuilder, QueryItem, ConversionService, Predicate> 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<Root, CriteriaBuilder, QueryItem, ConversionService, Predicate> 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<Root, CriteriaBuilder, QueryItem, ConversionService, Predicate> function4 = map.get(Tuple.of(x.opt, javaType));
if (function4 == null) {
throw new RuntimeException("无法识别的查询 " + x);
}
return function4.apply(root, criteriaBuilder, x, conversionService);