package com.mryao.gxkygl.common.query;
import com.github.wenhao.jpa.PredicateBuilder;
import com.github.wenhao.jpa.Sorts;
import com.github.wenhao.jpa.Specifications;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Range;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* @author zhouyang
* @Date 2017-04-15 上午9:52
* @Description 动态查询
* @Version 1.0
*/
public class QuerySpecification<T>{
//猜测用的时间格式
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
/**
* 拼装条件
* @param filters
* @param predicate
*/
public void toPredicate(List<Filter> filters, PredicateBuilder<T> predicate){
for (Filter filter : filters) {
switch (filter.getOperator()){
case eq:
if(!StringUtils.isEmpty(filter.getValue())){
predicate.eq(filter.getField(),filter.getValue());
}
break;
case ge:
try {
Integer value = new Integer(filter.getValue().toString());
predicate.ge(filter.getField(),value);
}catch (Exception e){
throw new RuntimeException("大于等于条件错误 " + e.getMessage());
}
break;
case gt:
try {
Integer value = new Integer(filter.getValue().toString());
predicate.gt(filter.getField(),value);
}catch (Exception e){
throw new RuntimeException("大于条件错误 " + e.getMessage());
}
break;
case in:
if(!StringUtils.isEmpty(filter.getValue())){
predicate.in(filter.getField(),(Object[])filter.getValue());
}
break;
case isNull:
predicate.eq(filter.getField(),null);
break;
case le:
try {
Integer value = new Integer(filter.getValue().toString());
predicate.le(filter.getField(),value);
}catch (Exception e){
throw new RuntimeException("小于等于条件错误 " + e.getMessage());
}
break;
case like:
if(!StringUtils.isEmpty(filter.getValue())){
predicate.like(filter.getField(),filter.getValue().toString());
}
break;
case lt:
try {
Integer value = new Integer(filter.getValue().toString());
predicate.lt(filter.getField(),value);
}catch (Exception e){
throw new RuntimeException("小于条件错误 " + e.getMessage());
}
break;
case neq:
if(!StringUtils.isEmpty(filter.getValue())){
predicate.ne(filter.getField(),filter.getValue());
}
break;
case notNull:
predicate.ne(filter.getField(),null);
break;
case between:
Object[] values = filter.getValues();
if (values == null || values.length != 2) {
throw new RuntimeException("between条件参数错误,参数必须为两个");
}
Range range;
Object[] guess = guess(values);
if (guess[0] instanceof Number) {
range = new Range((Double) guess[0], (Double) guess[1]);
} else {
range = new Range((Date) guess[0], (Date) guess[1]);
}
predicate.between(filter.getField(), range);
}
}
}
/**
* 猜测
* @param values
*/
public static Object[] guess(Object ...values) {
Object[] guessValues = new Object[values.length];
Boolean allIsDate = null;
for (int i = 0; i < values.length; i++) {
if (StringUtils.isEmpty(values[i])) {//如果值为空,那么我们将他当做时间格式处理
guessValues[i] = i == 0 ? new Date(0) : new Date(Long.MAX_VALUE);//这里补全了时间,按照第一位为1970开始。第二位也就是其他位取时间最大值
allIsDate = true;//所有的都应该是时间格式
continue;
}
try {
guessValues[i] = Double.valueOf(values[i].toString());
if (allIsDate!=null&&allIsDate) {//如果所有的都是时间,这个却不是时间,那么就有问题
throw new RuntimeException("值:'"+values[i].toString() + "'与'"+values[i-1].toString()+"'格式不统一");
}
allIsDate = false;
} catch (NumberFormatException e) {//这里只处理拦截数字格式异常
//猜测为数字,未命中
try {
guessValues[i] = sdf.parse(values[i].toString());
if (allIsDate!=null&&!allIsDate) {//如果之前一个不是时间
throw new RuntimeException("值:'"+values[i].toString() + "'与'"+values[i-1].toString()+"'格式不统一");
}
allIsDate = true;
} catch (ParseException e1) {//这里也只处理转换错误
//猜测为时间格式,未命中
//搞个屁哦
throw new RuntimeException("值:'"+values[i].toString()+"'为不支持的数据类型");
}
}
}
return guessValues;
}
/**
* 生成动态查询
* @param query
* @return
*/
public Specification<T> buildSpecification(Query query){
PredicateBuilder<T> andPredicate = Specifications.<T>and();
PredicateBuilder<T> orPredicate = Specifications.<T>or();
//获取条件
List<Filter> orFilter = query.getOrFilter();
List<Filter> andFilter = query.getAndFilter();
//解析Search
Search search = query.getSearch();
if(search != null && !StringUtils.isEmpty(search.getFields()) && !StringUtils.isEmpty(search.getValue())){
String[] fields = search.getFields().split(",");
for (String field : fields) {
orFilter.add(Filter.like(field,search.getValue()));
}
}
//生成Predicate
toPredicate(andFilter,andPredicate);
toPredicate(orFilter,orPredicate);
//条件合并
if(orFilter.size() == 0 && andFilter.size() > 0){
return andPredicate.build();
}else if(andFilter.size() == 0 && orFilter.size() > 0){
return orPredicate.build();
}else if(andFilter.size() == 0 && orFilter.size() == 0){
return null;
}else{
return andPredicate.predicate(orPredicate.build()).build();
}
}
/**
* 生成排序和分页对象
* @param query
* @return
*/
public Pageable buildPageable(Query query) {
//生成排序条件
if(!CollectionUtils.isEmpty(query.getSorts())){
Sorts.Builder builder = Sorts.builder();
for (Sort sort : qu
没有合适的资源?快使用搜索试试~ 我知道了~
基于SpringBoot的高校科研管理系统设计源码

共250个文件
java:132个
xml:99个
jpg:7个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 164 浏览量
2024-04-03
18:57:49
上传
评论
收藏 626KB ZIP 举报
温馨提示
本设计源码提供了一个基于SpringBoot的高校科研管理系统。项目包含250个文件,主要使用Java编程语言。文件类型包括132个Java源代码文件、99个XML配置文件、7个JPG图片文件、2个Idea项目文件、1个Git忽略文件、1个JAR包文件、1个Properties配置文件、1个LICENSE文件和1个Markdown文档。该系统适合用于学习和实践SpringBoot技术,以及开发高校科研相关的管理系统。
资源推荐
资源详情
资源评论
























收起资源包目录





































































































共 250 条
- 1
- 2
- 3
资源评论


沐知全栈开发
- 粉丝: 5865
- 资源: 5219
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 39-0305一元矩阵w偏导-1080P 高清-AVC.mp4
- Comsol光子晶体板谷态.pdf
- Comsol光子晶体板EP.pdf
- Comsol光子晶体板模式识别:全模型方法与半模型方法对比.pdf
- COMSOL光子晶体波导法诺共振.pdf
- COMSOL光子晶体光纤:有效折射率、模式色散及有效模式面积计算.pdf
- COMSOL光子晶体光纤:有效折射率、模式色散、有效模式面积计算.pdf
- 43-0309对数线性回归与广义线性回归-1080P 高清-AVC.mp4
- 42-0308求导没推给个例子-1080P 高清-AVC.mp4
- Comsol光子晶体光纤模式分析及其fsm mode计算.pdf
- COMSOL光子晶体连续域束缚态远场偏振计算:含K空间能带Q值模型及Matlab脚本及相关文献.pdf
- COMSOL光子晶体光纤及反谐振光纤:计算有效折射率、模场及多种损耗分析.pdf
- COMSOL光子晶体六边形晶格简约第一布里渊区能带.pdf
- COMSOL光子晶体能带计算的复现.pdf
- Comsol光子晶体能带求解:含一维和二维色散材料的光子晶体计算.pdf
- 44-0310对数或逻辑线性回归-1080P 高清-AVC.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
