关于jpa的Specification自定义函数,实现oracle的decode;以及如何在静态方法中调用注入的service
中秋佳节,多想吟诗一首:明月几时有,把酒问青天,不知天上宫。。。,行啦,不扯淡啦,中秋佳节也不能影响我学习的热情,说一说今天遇到问题
如何在静态方法中调用注入的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的更多相关文章
- 自定义函数hello,并注册到hive源码中并重新编译
1 编写自己的udf方法hello package cn.zhangjin.hive.udf; import org.apache.hadoop.hive.ql.exec.Description; i ...
- ORACLE当中自定义函数性优化浅析
为什么函数影响性能 在SQL语句中,如果不合理的使用函数(Function)就会严重影响性能,其实这里想说的是PL/SQL中的自定义函数,反而对于一些内置函数而言,影响性能的可能性较小.那么为什么SQ ...
- Entity Framework 6 Recipes 2nd Edition(10-5)译 -> 在存储模型中使用自定义函数
10-5. 在存储模型中使用自定义函数 问题 想在模型中使用自定义函数,而不是存储过程. 解决方案 假设我们数据库里有成员(members)和他们已经发送的信息(messages) 关系数据表,如Fi ...
- 浅谈Excel开发:四 Excel 自定义函数
我们知道,Excel中有很多内置的函数,比如求和,求平均,字符串操作函数,金融函数等等.在有些时候,结合业务要求,这些函数可能不能满足我们的需求,比如我想要一个函数能够从WebService上获取某只 ...
- Thinkphp模板怎么使用自定义函数
内置模板引擎支持对模板变量使用函数,并支持多个函数同时使用. 注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|fu ...
- Thinkphp模板中使用自定义函数的方法
注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### ...
- thinkphp模板中使用自定义函数
注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### ...
- Excel 自定义函数
浅谈Excel开发:四 Excel 自定义函数 我们知道,Excel中有很多内置的函数,比如求和,求平均,字符串操作函数,金融函数等等.在有些时候,结合业务要求,这些函数可能不能满足我们的需求,比 ...
- PL/SQL自定义函数
从SQL表达式中调用函数的限制 为了从SQL表达式中调用函数,一个用户定义函数必须: 是存储函数 只接受IN函数 只接收有受的SQL数据类型,而不接受PL/SQL数据类型 返回数据类型为有效的SQL数 ...
随机推荐
- GitPage部署
前言 该文章主要为了记录我如何在GitPage上面部署博客网站,这里的话,码云上面也有相同的功能. 若有小伙伴担心GitHub担心把中国的访问也禁了的话(大概不会吧),可以在码云上面部署.流程应该是差 ...
- python+Selenium-字符运行报错问题
最近开始接触自动化测试,在写一个简单的查询脚本时,遇到编码无法识别的问题 SyntaxError: Non-ASCII character '\xe5' in file F:/soft_Test/py ...
- net必问的面试题系列之基本概念和语法
上个月离职了,这几天整理了一些常见的面试题,整理成一个系列给大家分享一下,机会是给有准备的人,面试造火箭,工作拧螺丝,不慌,共勉. 1.net必问的面试题系列之基本概念和语法 2.net必问的面试题系 ...
- Python 创建目录 and 删除目录
import os import shutil #删除并创建目录 def rmdir(path): try: shutil.rmtree(path) print(path+':删除成功') os.ma ...
- Egret白鹭开发微信小游戏程序跳转功能(由一个小游戏跳转到另一个小游戏)
假设我们要实现的功能是从小游戏A跳转到小游戏B 对于小游戏A: (1)在platform.ts中添加代码如下: /** * 平台数据接口. * 由于每款游戏通常需要发布到多个平台上,所以提取出一个统一 ...
- Codeforces 985E
题意略. 思路: 这个题目开始想的有点暴力,后来发现有搜索的性质,因此转而用动态规划.首先,我们要把这些数排个序. 定义状态:dp[i]为排序后i~n能否成功打包,1表示可以,0表示不能打包. 状态转 ...
- React生命周期函数理解
一.组件挂载阶段 1. componentWillMount() 该方法在首次渲染之前调用,在一个组件挂载到卸载的过程中,仅仅执行这一次.该函数内可以state初始化的工作,与constructor的 ...
- React之 redux 的简单介绍及使用
1.为什么使用redux?在小型react项目的开发中 ,view(视图层)中的数据模型(即数据),可以存放在组件中的 state 对象,换句话说页面中的动态数据存放在 state 中. 但对于开发大 ...
- qt学习笔记(1):qt点击运行没有反应。
因为公司的项目需要,今天开始重新学习已经忘干净了的QT, 说起qt之前在学校刚接触的时候就打心底里喜欢这个编辑器, 因为一直使用vs做项目,面对着黑洞洞的窗口总让人不舒服, 自从接触了qt感觉迎来了曙 ...
- 一、mysql数据库,忘记密码怎么处理及处理过程中遇见的问题
1.输入cmd命令打开控制台: 2.进入mysql.exe所在的路径: 3.执行mysqld --skip-grant-tables(注意:在输入此命令之前先在任务管理器中结束mysqld.exe进程 ...