mirror of
https://codeup.aliyun.com/64f7d6b8ce01efaafef1e678/coal/coal.git
synced 2026-01-25 07:46:40 +08:00
完善查询
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user