springdata jpa封装数据库关键字(EQ, LIKE, GT, LT, GTE, LTE,IN)
数据库关键字申明,类SearchFilter:
/******************************************************************************** Copyright (c) 2005, 2014 springside.github.io** Licensed under the Apache License, Version 2.0 (the "License");*******************************************************************************/
package com.clearpro.common.modules.persistence;import java.util.Map;
import java.util.Map.Entry;import org.apache.commons.lang3.StringUtils;import com.google.common.collect.Maps;public class SearchFilter {public enum Operator {EQ, LIKE, GT, LT, GTE, LTE,IN}public String fieldName;public Object value;public Operator operator;public SearchFilter(String fieldName, Operator operator, Object value) {this.fieldName = fieldName;this.value = value;this.operator = operator;}/*** searchParams中key的格式为OPERATOR_FIELDNAME*/public static Map<String, SearchFilter> parse(Map<String, Object> searchParams) {Map<String, SearchFilter> filters = Maps.newHashMap();for (Entry<String, Object> entry : searchParams.entrySet()) {// 过滤掉空值String key = entry.getKey();Object value = entry.getValue();/*if (StringUtils.isBlank((String) value)) {continue;}*/// 拆分operator与filedAttributeString[] names = StringUtils.split(key, "_");if (names.length != 2) {throw new IllegalArgumentException(key + " is not a valid search filter name");}String filedName = names[1];Operator operator = Operator.valueOf(names[0]);// 创建searchFilterSearchFilter filter = new SearchFilter(filedName, operator, value);filters.put(key, filter);}return filters;}
}
关键字匹配的sql处理,类DynamicSpecifications:
/******************************************************************************** Copyright (c) 2005, 2014 springside.github.io** Licensed under the Apache License, Version 2.0 (the "License");*******************************************************************************/
package com.clearpro.common.modules.persistence;import java.util.Collection;
import java.util.List;import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;import org.apache.commons.lang3.StringUtils;
import org.springframework.data.jpa.domain.Specification;import com.clearpro.common.modules.utils.Collections3;
import com.google.common.collect.Lists;public class DynamicSpecifications {public static <T> Specification<T> bySearchFilter(final Collection<SearchFilter> filters, final Class<T> entityClazz) {return new Specification<T>() {@Overridepublic Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) {if (Collections3.isNotEmpty(filters)) {List<Predicate> predicates = Lists.newArrayList();for (SearchFilter filter : filters) {// nested path translate, 如Task的名为"user.name"的filedName, 转换为Task.user.name属性String[] names = StringUtils.split(filter.fieldName, ".");Path expression = root.get(names[0]);for (int i = 1; i < names.length; i++) {expression = expression.get(names[i]);}// logic operatorswitch (filter.operator) {case EQ:predicates.add(builder.equal(expression, filter.value));break;case LIKE:predicates.add(builder.like(expression, "%" + filter.value + "%"));break;case GT:predicates.add(builder.greaterThan(expression, (Comparable) filter.value));break;case LT:predicates.add(builder.lessThan(expression, (Comparable) filter.value));break;case GTE:predicates.add(builder.greaterThanOrEqualTo(expression, (Comparable) filter.value));break;case LTE:predicates.add(builder.lessThanOrEqualTo(expression, (Comparable) filter.value));break;case IN:predicates.add(expression.in(filter.value));break;}}// 将所有条件用 and 联合起来if (!predicates.isEmpty()) {return builder.and(predicates.toArray(new Predicate[predicates.size()]));}}return builder.conjunction();}};}
}
注意:IN 关键字的处理与其他不同
springdata jpa封装数据库关键字(EQ, LIKE, GT, LT, GTE, LTE,IN)相关推荐
- php gt lte gte,springdata jpa封装数据库关键字(EQ, LIKE, GT, LT, GTE, LTE,IN)
数据库关键字申明,类SearchFilter: /*************************************************************************** ...
- Spring Jpa实体中出现数据库关键字解决方法
Spring Jpa实体中出现数据库关键字解决方法 在Spring Jpa 中出现关键字是无法向数据库中添加等操作 有异常进行抛出. 这里可以使用字段个属性进行关联 @Column(name = &q ...
- 黑马 SpringData JPA笔记
课程链接:https://www.bilibili.com/video/BV1Y4411W7Rx?from=search&seid=415951199875837982 第一 orm思想 ...
- SpringBoot简介、SpringBoot 入门程序搭建、与JDBC、Druid、Mybatis和SpringData JPA的整合
一.SpringBoot 简介: spring boot并不是一个全新的框架,它不是spring解决方案的一个替代品,而是spring的一个封装.所以,你以前可以用spring做的事情,现在用spri ...
- 全网最全精析破解 Springboot+Jpa 对数据库增删改查
前言: 昨天做的是springboot+mybatis 对数据库进行增删改查 但是我感觉配置文件太多了 很麻烦 繁琐 今天搞一下springboot+Jpa对数据库进行增删改查, 感觉很好用 ,所以记 ...
- SpringData JPA 之疑难杂症
SpringData JPA 之疑难杂症 1.JPA自动建表不生成外键 SpringBoot项目搭配的JPA使用时候,有一对多的关系注解,那么自动会生成外键.外键在有些时候,会导致代码不能走通,我们不 ...
- SpringData JPA 详解(自定义查询、分页、事务控制)
简介 SpringData JPA是 JPA的一种实现,极大的简化了JPA的开发,原始JPA的开发,需要创建实体管理工厂,使用实体管理器定义各种查询进行CRUD操作,而SpringData JPA只需 ...
- 带你搭一个SpringBoot+SpringData JPA的环境
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家对SpringBoot和Spring Da ...
- idea加入springboot插件_带你搭一个SpringBoot+SpringData JPA的环境
前言 只有光头才能变强. 不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和SpringData ...
最新文章
- 如何设置文字的位置html5,怎么设置文字在表格中的位置
- 基于角色的访问控制(RBAC)
- Github火爆的项目,用聪明的方式学习Vim!
- FisherVector编码的来龙去脉
- Super BOM应用步骤总结
- servlet html登录,Servlet实现用户登录
- 第一百一十八期:运行 JavaScript 代码片段的 20 种工具
- 给来英国的女士或先生一点建议,同样关于行李.
- 洛谷P1978 集合 [2017年6月计划 数论08]
- php readfile cookie,python处理cookie详解
- 项目报告制作-中型无盘网吧
- MAC中安装Navicat Premium
- ios录音文件路径_苹果6s的录音储存在哪个文件夹
- 咸鱼Maya笔记—Maya 热键
- 彩票股票金融与运气之研究(二)-飘渺的希望
- Excel电子表格隔行自动填充底色
- 语音信号短时域分析之短时平均能量(四)
- 量化交易日记20210120
- Java基础单元测试
- 安装 Xcode_8.1.xip(踩坑)