中秋佳节,多想吟诗一首:明月几时有,把酒问青天,不知天上宫。。。,行啦,不扯淡啦,中秋佳节也不能影响我学习的热情,说一说今天遇到问题

如何在静态方法中调用注入的service

Public  class ClassA{

  public static ClassA classA;

  @Resource
  private Service service;

  //原理时在工程启动时加载,在静态方法前加载,这样就可以在静态方法中调用注入的方法啦
@PostConstruct
public void init() {
classA = this;
     classA.service=service;
}
}

关于jpa的Specification自定义函数

这个时自定义方法的源码,有注释,不多说啦
1 /**
* Create an expression for the execution of a database
* function.
* @param name function name
* @param type expected result type
* @param args function arguments
* @return expression
*/
<T> Expression<T> function(String name, Class<T> type,
Expression<?>... args);
咱说说这个类,也就是
ParameterizedFunctionExpression,是如何实现动态组合排序条件,实现decode

<T> Expression<T> function(String name, Class<T> type,
Expression<?>... args);

//这是function实现实际调用的方法;他调用的就是这个类ParameterizedFunctionExpression的构造方法

@Override
public <T> Expression<T> function(String name, Class<T> returnType, Expression<?>... arguments) {
return new ParameterizedFunctionExpression<T>( this, returnType, name, arguments );
}

//ParameterizedFunctionExpression的构造方法

public ParameterizedFunctionExpression(
CriteriaBuilderImpl criteriaBuilder,
Class<X> javaType,
String functionName,
Expression<?>... argumentExpressions) {
super( criteriaBuilder, javaType, functionName );
this.argumentExpressions = Arrays.asList( argumentExpressions );
this.isStandardJpaFunction = STANDARD_JPA_FUNCTION_NAMES.contains( functionName.toUpperCase(Locale.ROOT) );
}

//实现

Expression<Integer> expression = null;

//存储排序条件

List<Expression<?>> argumentExpressions = new ArrayList<Expression<?>>();

//排序字段

argumentExpressions.add(cb.literal("grade");

//排序的顺序
argumentExpressions.add(cb.literal(1));

expression = new ParameterizedFunctionExpression<Integer>((CriteriaBuilderImpl) cb, Integer.class, "decode",
argumentExpressions);

    @SuppressWarnings("all")
public Specification<CT> findByCondition(List<Filter> filter, List<Reorder> reOrders) {
return new Specification<CT>() { @Override
public Predicate toPredicate(Root<CT> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<Predicate>();
List<Order> orders = new ArrayList<Order>(); if (!CollectionUtils.isEmpty(filter)) {
filter.stream().forEach(filter -> { ParameterizedType pt = (ParameterizedType) this.getClass().getGenericInterfaces()[0];
Class<CT> clazz = (Class<CT>) 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]);
} Path<Object> queryPath = 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": {
List<String> str = 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": {
List<String> inStr = Arrays.asList(filter.getParam().trim().split(","));
List<Predicate> predicatesOr = new ArrayList<Predicate>();
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 -> {
Path<Object> sortPath = 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;
} }

关于jpa的Specification自定义函数,实现oracle的decode;以及如何在静态方法中调用注入的service的更多相关文章

  1. 自定义函数hello,并注册到hive源码中并重新编译

    1 编写自己的udf方法hello package cn.zhangjin.hive.udf; import org.apache.hadoop.hive.ql.exec.Description; i ...

  2. ORACLE当中自定义函数性优化浅析

    为什么函数影响性能 在SQL语句中,如果不合理的使用函数(Function)就会严重影响性能,其实这里想说的是PL/SQL中的自定义函数,反而对于一些内置函数而言,影响性能的可能性较小.那么为什么SQ ...

  3. Entity Framework 6 Recipes 2nd Edition(10-5)译 -> 在存储模型中使用自定义函数

    10-5. 在存储模型中使用自定义函数 问题 想在模型中使用自定义函数,而不是存储过程. 解决方案 假设我们数据库里有成员(members)和他们已经发送的信息(messages) 关系数据表,如Fi ...

  4. 浅谈Excel开发:四 Excel 自定义函数

    我们知道,Excel中有很多内置的函数,比如求和,求平均,字符串操作函数,金融函数等等.在有些时候,结合业务要求,这些函数可能不能满足我们的需求,比如我想要一个函数能够从WebService上获取某只 ...

  5. Thinkphp模板怎么使用自定义函数

    内置模板引擎支持对模板变量使用函数,并支持多个函数同时使用. 注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|fu ...

  6. Thinkphp模板中使用自定义函数的方法

    注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### ...

  7. thinkphp模板中使用自定义函数

    注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### ...

  8. Excel 自定义函数

    浅谈Excel开发:四 Excel 自定义函数   我们知道,Excel中有很多内置的函数,比如求和,求平均,字符串操作函数,金融函数等等.在有些时候,结合业务要求,这些函数可能不能满足我们的需求,比 ...

  9. PL/SQL自定义函数

    从SQL表达式中调用函数的限制 为了从SQL表达式中调用函数,一个用户定义函数必须: 是存储函数 只接受IN函数 只接收有受的SQL数据类型,而不接受PL/SQL数据类型 返回数据类型为有效的SQL数 ...

随机推荐

  1. Eclipse 连接不上 hadoop 的解决办法

    先说一下我的情况,集群的 hadoop 是 1.0.4 ,之后在虚拟机上搭建了最新稳定版 1.2.1 之后,Eclipse 插件始终连接不上. 出现 Error: Call to 192.168.1. ...

  2. STM32CubeMX工程修改MCU的两种方法

    有些时候我们在已经使用过一段时间的stm32cube创建的工程,需要更换一个同系列的芯片,比如Flash空间更大或者更小,第一种方法我在网上搜索过,就是使用cube选择一个新使用型号的MCU,然后使用 ...

  3. win7-BIOS中开启AHCI模式电脑蓝屏怎么办?

    win7-BIOS中开启AHCI模式电脑蓝屏怎么办? 来源:U大师 u盘装系统 不少网友都表示给电脑安装win7系统后,如果在BIOS中开启IDE模式就一切正常而为AHCI模式时就会出现蓝屏.其实那是 ...

  4. c# 三步递交模式调用同一个存储过程

    主要用于批量的sql操作:第一步创建中间表,第二步多次写数据到中间表,第三步 提交执行 创建三步递交的存储过程: CREATE PROC usp_testsbdj@bz int=0,@name VAR ...

  5. 走进JavaWeb技术世界5:初探Tomcat的HTTP请求过程

    初探Tomcat的HTTP请求过程 前言:1.作为Java开发人员,大多都对Tomcat不陌生,由Apache基金会提供技术支持与维护,因为其免费开源且易用,作为Web服务器深受市场欢迎,所以有必要对 ...

  6. 记一次mysql数据库失而复得过程

    背景: 由于是自己买的vps搭建的博客,用的是军哥的一键lnmp源码编译安装的,文章也就几篇,对备份并不太重视,想着等服务器快到期的时候备份一下不就行了. 后来在该服务器上测试lnmp分别编译编译安装 ...

  7. python实例:自动保存百度盘资源到百度盘中

    本实例的实现逻辑是,应用selenium UI自动化登录百度盘,读取存储百度分享地址和提取码的txt文档,打开百度盘分享地址,填入提取码,然后保存到指定的目录中 全部代码如下: # -*-coding ...

  8. Java 迭代接口:Iterator、ListIterator 和 Spliterator

    1. 简介 当我们使用 for 或 while 循环来遍历一个集合的元素,Iterator 允许我们不用担心索引位置,甚至让我们不仅仅是遍历一个集合,同时还可以改变它.例如,你如果要删除循环中的元素, ...

  9. tensorflow如何继续训练之前保存的模型

    https://blog.csdn.net/qq_23981335/article/details/81480220

  10. 《Head First 设计模式》笔记

    第一章 策略模式 00设计原则:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码放在一起. 把会变化的部分取出并封装起来,好让其它部分不会受到影响.结果如何?代码变化引起的不经意 ...