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的使用说明 工作中经常遇到客户提出这样的需求,希望在汇总合并中,能够把日期逐个枚举出来. 如图,原始数据是这样的: 客户希望能够实现这样的汇总合并: 那么通常我会使用 ...
随机推荐
- CDOJ 1060 秋实大哥与快餐店 字典树 水题
题目链接 B - 秋实大哥与快餐店 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Sub ...
- UVA 12299 线段树 ( 单点跟新 , 区间查询)
题目链接:题意:在传统的RMQ的基础上加上一个操作:shift(i1,i2,i3...ik),表示将这些元素,依次向左移动一位(训练指南247页) #include <iostream> ...
- select客户端模型封装——回调方式快速建立客户端
SockClient.h #pragma once #include<functional> #define _WINDOWS #ifdef _WINDOWS #define _WINSO ...
- Oracle--listagg函数使用注意
listagg是一个列转行函数,在一对多的情况下,通过该函数转换成一对一 该函数使用跟聚合函数中的SUM差不多,但需要注意的是,该函数不适合用于多表连接情况下,都则及时字段值相同也会出现多值 例如: ...
- Python实现用户注册到文件
import getpass #引入getpass模块,主要用来输入密码关闭回显 f=open('d:/user','a+') #定义文件对象并以追加方式打开,不存在就创建 f.seek(0) #文件 ...
- android遮罩阴影对话框的实现
定义 <style name="MyDialog" parent="@android:Theme.Dialog"> <item name=&q ...
- 《Effective Java》读书笔记 - 8.通用编程
Chapter 8 General Programming Item 45: Minimize the scope of local variables local variables应该在他们要被用 ...
- mysql 5.7 Could not load driverClass com.mysql.cj.jdbc.Driver
参考: http://www.manongjc.com/article/24424.html https://blog.csdn.net/kingscoming/article/details/788 ...
- 解决CsvWriter:中文乱码、末尾行多一行空格(/r)、非第一列空字符串""显示null问题
一:主要内容 解决CsvWriter存csv,csv文件打开后中文乱码问题 解决CsvWriter存csv,csv文件最后一行总是多一行空行的问题 解决CsvWriter存csv,csv文件不是第一列 ...
- lnmp源码搭建
Nginx工作原理 这里需要结合Apache的工作,对PHP文件处理过程的区别 1:Nginx是通过php-fpm这个服务来处理php文件 2:Apache是通过libphp5.so ...