package com.xzl.common.jpa.query;
import com.google.common.collect.Lists;
import com.xzl.common.jpa.enums.WhereOperator;
import com.xzl.common.jpa.model.SearchFilter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.EnumUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.jpa.domain.Specification;
import javax.persistence.criteria.*;
import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* @author:leihfei
* @description 动态构建jpa查询语言
* @date:Create in 21:08 2018/9/4
* @email:leihfein@gmail.com
*/
@Slf4j
public class DynamicSpecifications {
/**
* 用于存储每个线程的request请求
*/
private static final ThreadLocal<HttpServletRequest> LOCAL_REQUEST = new ThreadLocal<>();
/**
* 年月日时间格式
*/
private static final String SHORT_DATE = "yyyy-MM-dd";
/**
* 年月日时分秒时间格式
*/
private static final String LONG_DATE = "yyyy-MM-dd HH:mm:ss";
/**
* 时分秒时间格式
*/
private static final String TIME = "HH:mm:ss";
private static final String PERCENTAGE_NUMBER = "%";
private static final String SPOT = ".";
private static final String COMMA = ",";
/**
* @param entityClazz 实体类对象
* @param filterSet 条件
* @return org.springframework.data.jpa.domain.Specification<T>
* @author: leihfei
* @description 构建动态查询语句
* root 表示要构建的实体类信息
* query 相当于查询数据库中关键字,是一个接口
* builder 构建查询信息
* @date: 13:50 2018/12/6
* @email: leihfein@gmail.com
*/
public static <T> Specification<T> bySearchFilter(final Class<T> entityClazz, final Set<SearchFilter> filterSet) {
return (Root<T> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) -> {
if (CollectionUtils.isNotEmpty(filterSet)) {
List<Predicate> predicates = Lists.newArrayList();
List<Predicate> andPredicates = Lists.newArrayList();
// 构建查询对象
filterSet.forEach(filter -> {
// 实体类字段名称
String[] names = StringUtils.split(filter.getFieldName(), SPOT);
// 得到构造查询,字段名称
Path expression = root.get(names[0]);
for (int i = 1; i < names.length; i++) {
expression = expression.get(names[i]);
}
// 处理时间,或者枚举
Class clazz = dealDateAndEnum(filter, expression);
if (filter.getWhereType().equals(WhereOperator.OR)) {
setBuilder(criteriaBuilder, predicates, filter, expression, clazz);
} else {
setBuilder(criteriaBuilder, andPredicates, filter, expression, clazz);
}
});
if (CollectionUtils.isNotEmpty(predicates) && CollectionUtils.isNotEmpty(andPredicates)) {
Predicate or = criteriaBuilder.or(predicates.toArray(new Predicate[predicates.size()]));
Predicate and = criteriaBuilder.and(andPredicates.toArray(new Predicate[andPredicates.size()]));
return criteriaBuilder.and(or, and);
} else if (CollectionUtils.isNotEmpty(predicates) && CollectionUtils.isEmpty(andPredicates)) {
return criteriaBuilder.or(predicates.toArray(new Predicate[predicates.size()]));
} else {
return criteriaBuilder.and(andPredicates.toArray(new Predicate[andPredicates.size()]));
}
}
return criteriaBuilder.conjunction();
};
}
/**
* @param filter 过滤值
* @param expression 表达式
* @return java.lang.Class
* @author: leihfei
* @description 处理时间
* @date: 13:36 2018/9/6
* @email: leihfein@gmail.com
*/
private static Class dealDateAndEnum(SearchFilter filter, Path expression) {
// 进行日期,枚举等转换
Class clazz = expression.getJavaType();
if (Date.class.isAssignableFrom(clazz) &&
!filter.getValue().getClass().equals(clazz)) {
String value = (String) filter.getValue();
if (!value.contains(COMMA)) {
filter.setValue(transform2Date(value));
}
} else if (LocalDateTime.class.isAssignableFrom(clazz) &&
!filter.getValue().getClass().equals(clazz)
) {
// 时间很有可能包含between
String value = (String) filter.getValue();
if (!value.contains(COMMA)) {
filter.setValue(transform2LocalDateTime(value));
}
} else if (LocalDate.class.isAssignableFrom(clazz) &&
!filter.getValue().getClass().equals(clazz)
) {
String value = (String) filter.getValue();
if (!value.contains(COMMA)) {
filter.setValue(transform2LocalDate(value));
}
}
if (Enum.class.isAssignableFrom(clazz) && !filter.getValue().getClass().equals(clazz)) {
filter.setValue(transform2Enum(clazz, (String) filter.getValue()));
}
return clazz;
}
/**
* @param criteriaBuilder 构建查询语句
* @param predicates, 查询构建对象数组
* @param filter 过滤值
* @param expression 表达式
* @param clazz 实体类
* @return void
* @author: leihfei
* @description
* @date: 13:33 2018/9/6
* @email: leihfein@gmail.com
*/
private static void setBuilder(CriteriaBuilder criteriaBuilder, List<Predicate> predicates, SearchFilter filter, Path expression, Class clazz) {
// 设置匹配模式
Predicate predicate = null;
switch (filter.getOperator()) {
case EQ:
predicate = criteriaBuilder.equal(expression, filter.getValue());
break;
case LIKE:
predicate = criteriaBuilder.like(expression, PERCENTAGE_NUMBER + filter.getValue() + PERCENTAGE_NUMBER);
break;
case LLIKE:
predicate = criteriaBuilder.like(expression, PERCENTAGE_NUMBER + filter.getValue());
break;
case RLIKE:
predicate = criteriaBuilder.like(expression, filter.getValue() + PERCENTAGE_NUMBER);
break;
case GT:
predicate = criteriaBuilder.greaterThan(expression, (Comparable) filter.getValue());
break;
case GTE:
predicate = criteriaBuilder.greaterThanOrEqualTo(expression, (Comparable) filter.getValue());
break;
case LT:
predicate = criteriaBuilder.lessThan(expression, (Comparable) filter.getValue());
break;
case LTE:
predicate = criteriaBuilder.lessThanOrEqualTo(expression, (Comparable) filter.getValue());
break;
case IN:
predicate = expression.in((Object[]) filter.getValue().toString().split(COMMA));
break;
case ISNULL:
predicate = criteriaBuilder.isNull(expression);
break;
case ISNOTNULL:
没有合适的资源?快使用搜索试试~ 我知道了~
java+hibernate双数据源配置
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
共33个文件
java:30个
xml:1个
yml:1个
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
需积分: 28 1 下载量 24 浏览量
2022-03-18
15:19:02
上传
评论
收藏 25KB RAR 举报
温馨提示
java+hibernate双数据源配置,直接可用
资源详情
资源评论
资源推荐
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 33 条
- 1
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![avatar](https://profile-avatar.csdnimg.cn/47526540ca4d4013b1017805d6643548_qq_35719898.jpg!1)
Lovme_du
- 粉丝: 136
- 资源: 11
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- elasticsearch数据库下载、配置、使用案例
- springboot的概要介绍与分析
- C语言的概要介绍与分析
- 第一个较大的Android项目,基于Android平台的图书管理系统(Android studio).zip
- Cisco Packet Tracer 6.2 for Windows Instructor Version
- 使⽤pyIAST计算⽓体吸附选择性
- tmp_b056727e59b8123365486983f32baa9732607ec3c6137b12.pdf
- C代码实现文件的拆分和合并,本质上就是文件的读写操作.zip
- TVMP3player.apk.1
- 出马出马出马出马出马出马出马
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)
评论0