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

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

  1. Public class ClassA{
  2.  
  3.   public static ClassA classA;
  4.  
  5.   @Resource
      private Service service;

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

关于jpa的Specification自定义函数

  1. 这个时自定义方法的源码,有注释,不多说啦
    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. <T> Expression<T> function(String name, Class<T> type,
  10. Expression<?>... args);
  1. 咱说说这个类,也就是
    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);

  1. @SuppressWarnings("all")
  2. public Specification<CT> findByCondition(List<Filter> filter, List<Reorder> reOrders) {
  3. return new Specification<CT>() {
  4.  
  5. @Override
  6. public Predicate toPredicate(Root<CT> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
  7. List<Predicate> predicates = new ArrayList<Predicate>();
  8. List<Order> orders = new ArrayList<Order>();
  9.  
  10. if (!CollectionUtils.isEmpty(filter)) {
  11. filter.stream().forEach(filter -> {
  12.  
  13. ParameterizedType pt = (ParameterizedType) this.getClass().getGenericInterfaces()[0];
  14. Class<CT> clazz = (Class<CT>) pt.getActualTypeArguments()[0];
  15. CT ct = null;
  16. try {
  17. ct = clazz.newInstance();
  18. } catch (InstantiationException e) {
  19. // TODO Auto-generated catch block
  20. e.printStackTrace();
  21. } catch (IllegalAccessException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. }
  25.  
  26. String type = JudgeParamType.getObjectValue(ct, null, filter.getField());
  27. if (type == null) {
  28. String str[] = filter.getField().split(",");
  29. type = JudgeParamType.getObjectValue(ct, null, str[1]);
  30. }
  31.  
  32. Path<Object> queryPath = obtainParamPath(root, filter.getField());
  33.  
  34. switch (filter.getFilter()) {
  35. case "equal": {
  36. if ("Integer".equalsIgnoreCase(type)) {
  37. predicates.add(cb.equal(queryPath.as(Integer.class),
  38. SieStringUtils.getIntvalueByStr(filter.getParam().trim())));
  39. break;
  40. }
  41.  
  42. if ("Date".equalsIgnoreCase(type)) {
  43. predicates.add(cb.equal(queryPath.as(Date.class),
  44. SieStringUtils.getDatevalueByStr(filter.getParam().trim())));
  45. break;
  46. }
  47. predicates.add(cb.equal(queryPath.as(String.class), filter.getParam().trim()));
  48. break;
  49. }
  50. case "like": {
  51. predicates.add(cb.like(cb.upper(queryPath.as(String.class)),
  52. "%" + filter.getParam().trim().toUpperCase() + "%"));
  53. break;
  54. }
  55. case "range": {
  56. List<String> str = Arrays.asList(filter.getParam().trim().split(","));
  57. if ("Integer".equalsIgnoreCase(type)) {
  58. predicates.add(cb.greaterThanOrEqualTo(queryPath.as(Integer.class),
  59. SieStringUtils.getIntvalueByStr(str.get(0))));
  60. predicates.add(cb.lessThanOrEqualTo(queryPath.as(Integer.class),
  61. SieStringUtils.getIntvalueByStr(str.get(1))));
  62. break;
  63. }
  64.  
  65. if ("Double".equalsIgnoreCase(type)) {
  66. predicates.add(cb.greaterThanOrEqualTo(queryPath.as(Double.class),
  67. SieStringUtils.getDoublevalueByStr(str.get(0))));
  68. predicates.add(cb.lessThanOrEqualTo(queryPath.as(Double.class),
  69. SieStringUtils.getDoublevalueByStr(str.get(1))));
  70. break;
  71. }
  72.  
  73. if ("Date".equalsIgnoreCase(type)) {
  74. predicates.add(cb.greaterThanOrEqualTo(queryPath.as(Date.class),
  75. SieStringUtils.getDatevalueByStr(str.get(0))));
  76. predicates.add(cb.lessThanOrEqualTo(queryPath.as(Date.class),
  77. SieStringUtils.getDatevalueByStr(str.get(1))));
  78. break;
  79. }
  80. predicates.add(cb.greaterThanOrEqualTo(queryPath.as(String.class), str.get(0)));
  81. predicates.add(cb.lessThanOrEqualTo(queryPath.as(String.class), str.get(1)));
  82. break;
  83. }
  84. case "gt": {
  85. if ("Integer".equalsIgnoreCase(type)) {
  86. predicates.add(cb.greaterThanOrEqualTo(queryPath.as(Integer.class),
  87. SieStringUtils.getIntvalueByStr(filter.getParam().trim())));
  88. break;
  89. }
  90.  
  91. if ("Double".equalsIgnoreCase(type)) {
  92. predicates.add(cb.greaterThanOrEqualTo(queryPath.as(Double.class),
  93. SieStringUtils.getDoublevalueByStr(filter.getParam().trim())));
  94. break;
  95. }
  96.  
  97. if ("Date".equalsIgnoreCase(type)) {
  98. predicates.add(cb.greaterThanOrEqualTo(queryPath.as(Date.class),
  99. SieStringUtils.getDatevalueByStr(filter.getParam().trim())));
  100. break;
  101. }
  102. predicates
  103. .add(cb.greaterThanOrEqualTo(queryPath.as(String.class), filter.getParam().trim()));
  104. break;
  105. }
  106.  
  107. case "lt": {
  108. if ("Integer".equalsIgnoreCase(type)) {
  109. predicates.add(cb.lessThanOrEqualTo(queryPath.as(Integer.class),
  110. SieStringUtils.getIntvalueByStr(filter.getParam().trim())));
  111. break;
  112. }
  113.  
  114. if ("Double".equalsIgnoreCase(type)) {
  115. predicates.add(cb.lessThanOrEqualTo(queryPath.as(Double.class),
  116. SieStringUtils.getDoublevalueByStr(filter.getParam().trim())));
  117. break;
  118. }
  119.  
  120. if ("Date".equalsIgnoreCase(type)) {
  121. predicates.add(cb.lessThanOrEqualTo(queryPath.as(Date.class),
  122. SieStringUtils.getDatevalueByStr(filter.getParam().trim())));
  123. break;
  124. }
  125. predicates.add(cb.lessThanOrEqualTo(queryPath.as(String.class), filter.getParam().trim()));
  126. break;
  127. }
  128.  
  129. case "in": {
  130. List<String> inStr = Arrays.asList(filter.getParam().trim().split(","));
  131. List<Predicate> predicatesOr = new ArrayList<Predicate>();
  132. inStr.forEach(param -> {
  133. if ("null".equalsIgnoreCase(param)) {
  134. predicatesOr.add(cb.isNull(queryPath));
  135. } else {
  136. predicatesOr.add(cb.equal(queryPath, param));
  137. }
  138. });
  139. Predicate[] predicateOr = predicatesOr.toArray(new Predicate[predicatesOr.size()]);
  140. predicates.add(cb.or(predicateOr));
  141.  
  142. break;
  143. }
  144. case "notnull": {
  145. predicates.add(cb.isNotNull(queryPath));
  146. cb.literal("e");
  147. }
  148.  
  149. default:
  150. break;
  151. }
  152.  
  153. });
  154. }
  155.  
  156. if (!CollectionUtils.isEmpty(reOrders)) {
  157. reOrders.stream().forEach(sort -> {
  158. Path<Object> sortPath = obtainParamPath(root, sort.getField());
  159. orders.add(getDecodeOrders(root, cb, sort.getField(), sort.getDirection()));
  160. });
  161. }
  162.  
  163. Predicate predicate = cb.and(predicates.toArray(new Predicate[predicates.size()]));
  164.  
  165. if (!CollectionUtils.isEmpty(orders)) {
  166. query.orderBy(orders);
  167. }
  168. return query.getRestriction();
  169. }
  170. };
  171. }
  1. public static class Filter {
  2. @ApiModelProperty(required = true)
  3. private String filter;// where
  4. @ApiModelProperty(required = true)
  5. private String field;
  6. @ApiModelProperty(required = true)
  7. private String param;
  8.  
  9. public String getFilter() {
  10. return filter;
  11. }
  12.  
  13. public void setFilter(String filter) {
  14. this.filter = filter;
  15. }
  16.  
  17. public String getField() {
  18. return field;
  19. }
  20.  
  21. public void setField(String field) {
  22. this.field = field;
  23. }
  24.  
  25. public String getParam() {
  26. return param;
  27. }
  28.  
  29. public void setParam(String param) {
  30. this.param = param;
  31. }
  32.  
  33. }
  1. public static class Reorder {
  2. @ApiModelProperty(required = true)
  3. private String direction;
  4. @ApiModelProperty(required = true)
  5. private String field;
  6.  
  7. public String getDirection() {
  8. return direction;
  9. }
  10.  
  11. public void setDirection(String direction) {
  12. this.direction = direction;
  13. }
  14.  
  15. public String getField() {
  16. return field;
  17. }
  18.  
  19. public void setField(String field) {
  20. this.field = field;
  21. }
  22.  
  23. }

关于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. 本地NTP服务器与客户端配置

    1. NTP 简介 NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 在集群中,为了保证各节点之间的时间一致,我们通常需要配置本地的 NT ...

  2. Guava cache使用总结

    缓存分为本地缓存和远端缓存.常见的远端缓存有Redis,MongoDB:本地缓存一般使用map的方式保存在本地内存中.一般我们在业务中操作缓存,都会操作缓存和数据源两部分.如:put数据时,先插入DB ...

  3. 上手mongodb

    上手MongoDB MongoDB 是一个跨平台的,面向文档的数据库,如果你了解spring-data-jpa的使用, 那么恭喜你,你已经可以使用mongodb做开发了 使用这种类型的数据库还是挺方便 ...

  4. html学习笔记整理

    网页 1.网页的组成部分 网页是由文字,图片,视频,音频,输入框,按钮这些元素(也就是html标签)组成. 2.浏览网页常用的五大主流浏览器 谷歌,IE,火狐,欧朋,safari.浏览器的内核(渲染引 ...

  5. Git简易使用教程

    1.Git 安装 2.设置git登录信息 3.git操作命令 4.提交代码的过程中几个命令的顺序 5.git 学习资料. 1.Git 安装 Git 下载地址:https://git-scm.com/d ...

  6. MapReduce on Yarn运行原理

    一.概念综述 MapReduce是一种可用于数据处理的编程模型(或计算模型),该模型可以比较简单,但想写出有用的程序却不太容易.MapReduce能将大型数据处理任务分解成很多单个的.可以在服务器集群 ...

  7. net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 1

    目录 前言 拦截器 异常拦截器 测试结果 身份验证拦截器 测试 小结 补充 2019-07-31 前言 一天天不知道怎么过的,但确实挺忙,事赶事不带停那种,让我感觉跟在流水线干活一样,忙活的事差不多了 ...

  8. 第一次appium自动化

    今天,自己独自做了一下app自动化,从搭环境到写好一个脚本花了很长时间.用的主要环境是python3.7+appium+sdk+夜神模拟器.appium环境搭建较于复杂,这里就不累述,参考百度教程. ...

  9. Git revert -m

    这其实是个非常简单的指令,甚至用AS,直接右键操作不需要两秒钟 但今天使用命令行的方式操作的时候居然发现了点不一样的地方: 如下我希望revert某个commit,找到了它的id,跑一下命令之后居然发 ...

  10. python 23 继承

    目录 继承--inheritance 1. 面向对象继承: 2. 单继承 2.1 类名执行父类的属性.方法 2.2 子类对象执行父类的属性.方法 2.3 执行顺序 2.4 既要执行子类的方法,又要执行 ...