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等扩展的更多相关文章

  1. MySQL中的模糊查询 like 和 Oracle中的 instr() 函数有同样的查询效果

    注:MySQL中的模糊查询 like 和 Oracle中的 instr() 函数有同样的查询效果: 如下所示: MySQL: select * from tableName where name li ...

  2. oracle函数操作

    感于总有些网友提出一些非常基础的问题,比如有没有实现某某功能的函数啊,某某函数是做什么用的啊,格式是什么等等,同时也感受到自己对oracle函数认识的不足,于是集中月余时间专注于oracle函数,小有 ...

  3. 汉字转拼音的Oracle函数

    前言: 最近处理一个特殊的问题,需要用到汉字自动转换拼音的功能. 解决: 在这里找了不少资料,都是有所缺陷,而且也好像很绕.其实是一个很简单的东东.后来还是自己写了一个函数获取.分享出来,给有需要的X ...

  4. BayaiM__ oracle函数_01

    BayaiM__ oracle函数_01   Oracle函数--------------------------------------------------------------------- ...

  5. BayaiM__ oracle函数_02

    BayaiM__ oracle函数_02   Oracle中的字符串函数---------------------------------------------------------------- ...

  6. 【函数】Oracle函数系列(1)--字符函数

    [函数]Oracle函数系列(1)--字符函数 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识 ...

  7. oracle函数,游标,视图使用总结0.000000000000000000001

    oracle函数或者叫存储过程,在实际的开发过程中对于复杂的业务需求是非常有用的,非常有效率的也是非常好玩儿的一个技术点. 平常在开发过程中对于CRUD功能较多.一般SQL即可应付,大不了就是长一点而 ...

  8. 【函数】Oracle函数系列(2)--数学函数及日期函数

    [函数]Oracle函数系列(2)--数学函数及日期函数 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不 ...

  9. oracle函数listagg的使用说明(分组后连接字段)

    关于oracle函数listagg的使用说明 工作中经常遇到客户提出这样的需求,希望在汇总合并中,能够把日期逐个枚举出来. 如图,原始数据是这样的: 客户希望能够实现这样的汇总合并: 那么通常我会使用 ...

随机推荐

  1. 多线程--future模式初体验

    第一次使用多线程,虽然理解的不是很透彻,但是也值得记录下.用的是future模式. 创建个线程池:private ExecutorService cachedThreadPool = Executor ...

  2. HTML5 大文件断点续传完整思路整理

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  3. sh_08_打印小星星

    sh_08_打印小星星 # 在控制台连续输出五行 *,每一行星号的数量依次递增 # * # ** # *** # **** # ***** # 1. 定义一个计数器变量,从数字1开始,循环会比较方便 ...

  4. centos设置定时删除文件定时清理网站日志

    1.进入linux系统 2.在任意目录创建一个sh后缀的文件,如: 3.编辑打开该文件,如图: 4.此时按键盘上的“i”键或者“insert”键,进入编辑模式 输入: #!/bin/shfind /d ...

  5. 使用Map接收返回数据库的数据

    查询返回值是map类型的一条数据 1 首先在接口中写方法 public interface EmployeeMapper { //返回一条记录的map:key就是列名,值就是对应的值 public M ...

  6. db4o这个对象数据库有很多优点,但为什么不是很火? 大家有没有用过db4o的?

    没有主键的概念(因为对象的内存地址,或者引用就能标志一个对象了).因而外界想指向一个具体的对象就比较困难(比如本页的url里的1079505). 激活/保存层次的问题.获取一个对象,它的字段引用了其它 ...

  7. Object 的 property descriptor

    property descriptor 属性描述符: o = { get foo() { return 17; } }; d = Object.getOwnPropertyDescriptor(o, ...

  8. Selenium学习之==>WebDriver驱动对照表

    转自www.imdsx.cn 1.Chrome 对于chrome浏览器,有时候会有闪退的情况,也许是版本冲突的问题,我们要对照着这个表来对照查看是不是webdriver和chrome版本不对. chr ...

  9. laravel 使用PhantomMagick导出pdf ,在Linux下安装字体

    git项目地址:https://github.com/anam-hossain/phantommagick sudo apt-get -y install fontconfig xfonts-util ...

  10. CSS3—— 多列 用户界面 图片 按钮

    多列 将文本内容设计成像报纸一样的多列布局 多列创建 间隙 列边框 边框颜色+宽度 指定列的宽度 指定元素跨越多少列 用户界面 由用户调整元素大小[谷歌浏览器等] 以确切的方式定义适应某个区域的具体内 ...