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. 【转载】自动化运维系列之Cobbler给Openstack节点安装操作系统

    preface 我们在一篇博文知道了如何搭建Cobbler,那么下面就通过Cobbler来安抓Openstack所有节点吧. 服务器配置信息如下: 主机名 IP 角色 Cobbler.node.com ...

  2. pyinstaller打包的exe太大?你需要嵌入式python玄学

    pyinstaller打包一个exe动辄几十M几百M (特别是import pandas以后) 知乎上居然没有人po这方面的”知识“(手动狗头) 查了很多关于reduce pyinstaller打包出 ...

  3. (转)python selenium-webdriver 元素操作之鼠标和键盘事件

    参考资料:https://blog.csdn.net/zh175578809/article/details/76767748 参考资料2:https://blog.csdn.net/qq_41817 ...

  4. 手动创建Maven项目并建立两个项目之间的依赖关系

    用命令行快速建立maven项目 -> mvn:archetype:generate -> 直接回车或者自己输入你想生成的 -> groupId ->artifactId -&g ...

  5. java 用redisTemplate 的 Operations存取list集合

    一 .存取为list类型 @RestController @RequestMapping("/test") @Slf4j public class TestController { ...

  6. springBoot 配置url 访问图片

    需要添加依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  7. 如果将get请求转换成post请求

    td><a href="emp/${emp.id}">Edit</a></td> <form action="" ...

  8. easyhook源码分析二——注入

    EasyHook 中的注入方法. 函数原型 // EasyHook 中的命名比较有意思,Rh 代表的就是Remote Hook,此函数就是远程钩子的一个子过程----注入,前面的宏代表它是导出函数. ...

  9. (转)深入理解Java:注解(Annotation)自定义注解入门

    向作者致敬! 转自:http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在 ...

  10. 应用安全 - 中间件 - Apache - Apache POI

    CVE-2014-3529 Date2014 类型 注入XML外部实体访问外部实体资源或者读取任意文件 影响范围 Apache POI 3.10-FINAL及以前版本 复现 CVE-2016-5000 ...