Jpa-Spec oracle函数bitand,instr等扩展
jpa-spec github: https://github.com/wenhao/jpa-spec
使用这个框架可以简化我们拼条件的复杂度,如下代码:
public Page<Person> findAll(SearchRequest request) {
Specification<Person> specification = Specifications.<Person>and()
.eq(StringUtils.isNotBlank(request.getName()), "name", request.getName())
.gt("age", 18)
.between("birthday", new Date(), new Date())
.like("nickName", "%og%")
.build();
Sort sort = Sorts.builder()
.desc(StringUtils.isNotBlank(request.getName()), "name")
.asc("birthday")
.build();
return personRepository.findAll(specification, new PageRequest(0, 15, sort));
}
这是一个分页+排序的查询。
但如果我们使用的是数据库特定的函数,这个框架提供的方法就不够用了,需要我们扩展:
我们使用的是oracle数据库,它的函数如bitand, instr就需要我们扩展:
jpa-spec bitand扩展:
/**
* Oracle bitand函数 计算扣款规则rulebit
*
* @author :hkk
* @date :Created in 2019/7/24 10:34
*/
public class BitandSpecification<T> extends AbstractSpecification<T> {
private String property;
private List<BigDecimal> values; public BitandSpecification(String property, List<BigDecimal> values) {
this.property = property;
this.values = values;
} @Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) { BigDecimal sum = values.stream().reduce(BigDecimal::add).get(); LiteralExpression<BigDecimal> literalExpression = new LiteralExpression<>(null, sum); Expression<BigDecimal> ruleBit = cb.function("bitand",
BigDecimal.class,
root.get(property), literalExpression); return cb.greaterThan(ruleBit, BigDecimal.ZERO); }
}
jpa-spec instr扩展:
/**
* Oracle instr函数 计算扣款规则rulebit
*
* @author :hkk
* @date :Created in 2019/7/24 10:34
*/
public class IntstrSpecification<T> extends AbstractSpecification<T> {
private String property;
private String value; public IntstrSpecification(String property, String value) {
this.property = property;
this.value = value;
} @Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) { LiteralExpression literalExpression = new LiteralExpression(null, value); Expression<BigDecimal> instr = cb.function("instr",
BigDecimal.class,
root.get(property), literalExpression); return cb.greaterThan(instr, BigDecimal.ZERO); }
}
然后,我们再修改PredicateBuilder类:增加两个方法:
/**
* oracle 函数bitand
* @param property
* @param var
* @return
*/
public PredicateBuilder<T> bitand(String property, List var) { if (!CollectionUtils.isEmpty(var)) {
this.predicate(true, new BitandSpecification(property, var));
}
return this;
} /**
* oracle 函数instr
* @param property
* @param var
* @return
*/
public PredicateBuilder<T> instr(String property, String var) { if (StringUtils.isNotBlank(var)) {
this.predicate(true, new IntstrSpecification(property, var));
}
return this;
}
同时我们增加了一些方法,传入参数为空时的判断,减少开发人员的代码量:
/**
* value不为空时 in
* @param property
* @param values
* @return
*/
public PredicateBuilder<T> inWhereHasValues(String property, List values) {
if (!CollectionUtils.isEmpty(values)) {
this.in(property, values);
}
return this;
} /**
* 当values为空是 is null
* 当values不为空时 in
* @param property
* @param values
* @return
*/
public PredicateBuilder<T> inAndNull(String property, List values) {
if (CollectionUtils.isEmpty(values)) {
return this.eq(property, values); }
return in(property,values);
} public PredicateBuilder<T> eqWhereHasValue(String property, Object... values) {
if (values == null) {
return this;
}
if (values.length == 1) {
if (values[0] == null) {
return this;
}
if (StringUtils.isBlank(String.valueOf(values[0]))) {
return this;
} } return eq(true, property, values);
}
希望对刚入门jps的同学有所帮助,也算是我们对社区的回馈:)
Jpa-Spec oracle函数bitand,instr等扩展的更多相关文章
- MySQL中的模糊查询 like 和 Oracle中的 instr() 函数有同样的查询效果
注:MySQL中的模糊查询 like 和 Oracle中的 instr() 函数有同样的查询效果: 如下所示: MySQL: select * from tableName where name li ...
- oracle函数操作
感于总有些网友提出一些非常基础的问题,比如有没有实现某某功能的函数啊,某某函数是做什么用的啊,格式是什么等等,同时也感受到自己对oracle函数认识的不足,于是集中月余时间专注于oracle函数,小有 ...
- 汉字转拼音的Oracle函数
前言: 最近处理一个特殊的问题,需要用到汉字自动转换拼音的功能. 解决: 在这里找了不少资料,都是有所缺陷,而且也好像很绕.其实是一个很简单的东东.后来还是自己写了一个函数获取.分享出来,给有需要的X ...
- BayaiM__ oracle函数_01
BayaiM__ oracle函数_01 Oracle函数--------------------------------------------------------------------- ...
- BayaiM__ oracle函数_02
BayaiM__ oracle函数_02 Oracle中的字符串函数---------------------------------------------------------------- ...
- 【函数】Oracle函数系列(1)--字符函数
[函数]Oracle函数系列(1)--字符函数 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识 ...
- oracle函数,游标,视图使用总结0.000000000000000000001
oracle函数或者叫存储过程,在实际的开发过程中对于复杂的业务需求是非常有用的,非常有效率的也是非常好玩儿的一个技术点. 平常在开发过程中对于CRUD功能较多.一般SQL即可应付,大不了就是长一点而 ...
- 【函数】Oracle函数系列(2)--数学函数及日期函数
[函数]Oracle函数系列(2)--数学函数及日期函数 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不 ...
- oracle函数listagg的使用说明(分组后连接字段)
关于oracle函数listagg的使用说明 工作中经常遇到客户提出这样的需求,希望在汇总合并中,能够把日期逐个枚举出来. 如图,原始数据是这样的: 客户希望能够实现这样的汇总合并: 那么通常我会使用 ...
随机推荐
- Django 的 CBV&FBV
Django FBV, function base view 视图里使用函数处理请求 url 1 url(r‘^users/‘, views.users), views 1 2 3 4 5 from ...
- UVa 1596 Bug Hunt (string::find && map && 模拟)
题意 : 给出几组由数组定义与赋值构成的编程语句, 有可能有两种BUG, 第一种为数组下标越界, 第二种为使用尚未定义的数组元素, 叫你找出最早出现BUG的一行并输出, 每组以' . '号分隔, 当有 ...
- 聊聊 Vue 的双向数据绑定,Model 如何改变 View,View 又是如何改变 Model 的
todo defineProperty() 参考: https://www.cnblogs.com/wangjiachen666/p/9883916.html
- NOIP2009靶形数独(暴搜)
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明 ...
- djangle中模板系统的使用
django相关的命令行命令: 创建一个djaongo的应用:在已经创建号的应用文件夹中运行:django-admin.py startproject projectName 开启系统自带的服务器在网 ...
- 通过构造器配置Bean
public class Role { private Log id; private String roleName; private String note; public Role(String ...
- Linux shell - shift命令用法(转载)
位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...
- Java源码阅读-Integer(基于jdk1.8)
public final class Integer extends Number implements Comparable<Integer> Integer 由final修饰了,所以该 ...
- jsp四种属性范围
在JSP提供了四种属性的保存范围.所谓的属性保存范围,指的就是一个设置的对象,可以在多个页面中保存并可以继续使用.它们分别是:page.request.session.appliction. 1.pa ...
- [NN] Guided Backpropgation 可视化
Pytorch Guided Backpropgation Intro guided backpropgation通过修改RELU的梯度反传,使得小于0的部分不反传,只传播大于0的部分,这样到第一个c ...