中秋佳节,多想吟诗一首:明月几时有,把酒问青天,不知天上宫。。。,行啦,不扯淡啦,中秋佳节也不能影响我学习的热情,说一说今天遇到问题
如何在静态方法中调用注入的servicePublic class ClassA{
public static ClassA classA;
@Resource
private Service service;
//原理时在工程启动时加载,在静态方法前加载,这样就可以在静态方法中调用注入的方法啦
@PostConstruct public void init() {
classA = this;
classA.service=service;
}
}
关于jpa的Specification自定义函数这个时自定义方法的源码,有注释,不多说啦
1 /** 2 * Create an expression for the execution of a database 3 * function. 4 * @param name function name 5 * @param type expected result type 6 * @param args function arguments 7 * @return expression 8 */ 9
咱说说这个类,也就是
ParameterizedFunctionExpression,是如何实现动态组合排序条件,实现decode
//这是function实现实际调用的方法;他调用的就是这个类ParameterizedFunctionExpression的构造方法
@Override
public
//ParameterizedFunctionExpression的构造方法
public ParameterizedFunctionExpression(
CriteriaBuilderImpl criteriaBuilder,
Class
//实现
Expression
//存储排序条件
List<Expression
//排序字段
argumentExpressions.add(cb.literal("grade");
//排序的顺序
argumentExpressions.add(cb.literal(1));
expression = new ParameterizedFunctionExpression
@SuppressWarnings("all") public SpecificationfindByCondition(Listfilter, List reOrders) { return new Specification() {
@Override public Predicate toPredicate(Rootroot, CriteriaQuery query, CriteriaBuilder cb) {
Listpredicates = new ArrayList();
Listorders = new ArrayList(); if (!CollectionUtils.isEmpty(filter)) {
filter.stream().forEach(filter -> {
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericInterfaces()[0];
Classclazz = (Class) pt.getActualTypeArguments()[0];
CT ct = null; try {
ct = clazz.newInstance();
} catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace();
} catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace();
}
String type = JudgeParamType.getObjectValue(ct, null, filter.getField()); if (type == null) {
String str[] = filter.getField().split(",");
type = JudgeParamType.getObjectValue(ct, null, str[1]);
}
PathqueryPath = obtainParamPath(root, filter.getField()); switch (filter.getFilter()) { case "equal": { if ("Integer".equalsIgnoreCase(type)) {
predicates.add(cb.equal(queryPath.as(Integer.class),
SieStringUtils.getIntvalueByStr(filter.getParam().trim()))); break;
} if ("Date".equalsIgnoreCase(type)) {
predicates.add(cb.equal(queryPath.as(Date.class),
SieStringUtils.getDatevalueByStr(filter.getParam().trim()))); break;
}
predicates.add(cb.equal(queryPath.as(String.class), filter.getParam().trim())); break;
} case "like": {
predicates.add(cb.like(cb.upper(queryPath.as(String.class)), "%" + filter.getParam().trim().toUpperCase() + "%")); break;
} case "range": {
Liststr = Arrays.asList(filter.getParam().trim().split(",")); if ("Integer".equalsIgnoreCase(type)) {
predicates.add(cb.greaterThanOrEqualTo(queryPath.as(Integer.class),
SieStringUtils.getIntvalueByStr(str.get(0))));
predicates.add(cb.lessThanOrEqualTo(queryPath.as(Integer.class),
SieStringUtils.getIntvalueByStr(str.get(1)))); break;
} if ("Double".equalsIgnoreCase(type)) {
predicates.add(cb.greaterThanOrEqualTo(queryPath.as(Double.class),
SieStringUtils.getDoublevalueByStr(str.get(0))));
predicates.add(cb.lessThanOrEqualTo(queryPath.as(Double.class),
SieStringUtils.getDoublevalueByStr(str.get(1)))); break;
} if ("Date".equalsIgnoreCase(type)) {
predicates.add(cb.greaterThanOrEqualTo(queryPath.as(Date.class),
SieStringUtils.getDatevalueByStr(str.get(0))));
predicates.add(cb.lessThanOrEqualTo(queryPath.as(Date.class),
SieStringUtils.getDatevalueByStr(str.get(1)))); break;
}
predicates.add(cb.greaterThanOrEqualTo(queryPath.as(String.class), str.get(0)));
predicates.add(cb.lessThanOrEqualTo(queryPath.as(String.class), str.get(1))); break;
} case "gt": { if ("Integer".equalsIgnoreCase(type)) {
predicates.add(cb.greaterThanOrEqualTo(queryPath.as(Integer.class),
SieStringUtils.getIntvalueByStr(filter.getParam().trim()))); break;
} if ("Double".equalsIgnoreCase(type)) {
predicates.add(cb.greaterThanOrEqualTo(queryPath.as(Double.class),
SieStringUtils.getDoublevalueByStr(filter.getParam().trim()))); break;
} if ("Date".equalsIgnoreCase(type)) {
predicates.add(cb.greaterThanOrEqualTo(queryPath.as(Date.class),
SieStringUtils.getDatevalueByStr(filter.getParam().trim()))); break;
}
predicates
.add(cb.greaterThanOrEqualTo(queryPath.as(String.class), filter.getParam().trim())); break;
} case "lt": { if ("Integer".equalsIgnoreCase(type)) {
predicates.add(cb.lessThanOrEqualTo(queryPath.as(Integer.class),
SieStringUtils.getIntvalueByStr(filter.getParam().trim()))); break;
} if ("Double".equalsIgnoreCase(type)) {
predicates.add(cb.lessThanOrEqualTo(queryPath.as(Double.class),
SieStringUtils.getDoublevalueByStr(filter.getParam().trim()))); break;
} if ("Date".equalsIgnoreCase(type)) {
predicates.add(cb.lessThanOrEqualTo(queryPath.as(Date.class),
SieStringUtils.getDatevalueByStr(filter.getParam().trim()))); break;
}
predicates.add(cb.lessThanOrEqualTo(queryPath.as(String.class), filter.getParam().trim())); break;
} case "in": {
ListinStr = Arrays.asList(filter.getParam().trim().split(","));
ListpredicatesOr = new ArrayList();
inStr.forEach(param -> { if ("null".equalsIgnoreCase(param)) {
predicatesOr.add(cb.isNull(queryPath));
} else {
predicatesOr.add(cb.equal(queryPath, param));
}
});
Predicate[] predicateOr = predicatesOr.toArray(new Predicate[predicatesOr.size()]);
predicates.add(cb.or(predicateOr)); break;
} case "notnull": {
predicates.add(cb.isNotNull(queryPath));
cb.literal("e");
} default: break;
}
});
} if (!CollectionUtils.isEmpty(reOrders)) {
reOrders.stream().forEach(sort -> {
PathsortPath = obtainParamPath(root, sort.getField());
orders.add(getDecodeOrders(root, cb, sort.getField(), sort.getDirection()));
});
}
Predicate predicate = cb.and(predicates.toArray(new Predicate[predicates.size()])); if (!CollectionUtils.isEmpty(orders)) {
query.orderBy(orders);
} return query.getRestriction();
}
};
}
public static class Filter {
@ApiModelProperty(required = true) private String filter;// where
@ApiModelProperty(required = true) private String field;
@ApiModelProperty(required = true) private String param; public String getFilter() { return filter;
} public void setFilter(String filter) { this.filter = filter;
} public String getField() { return field;
} public void setField(String field) { this.field = field;
} public String getParam() { return param;
} public void setParam(String param) { this.param = param;
}
}
public static class Reorder {
@ApiModelProperty(required = true) private String direction;
@ApiModelProperty(required = true) private String field; public String getDirection() { return direction;
} public void setDirection(String direction) { this.direction = direction;
} public String getField() { return field;
} public void setField(String field) { this.field = field;
}
}