数据库关键字申明,类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 Mapparse(MapsearchParams) {

Mapfilters = Maps.newHashMap();

for (Entryentry : searchParams.entrySet()) {

// 过滤掉空值

String key = entry.getKey();

Object value = entry.getValue();

/*if (StringUtils.isBlank((String) value)) {

continue;

}*/

// 拆分operator与filedAttribute

String[] 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]);

// 创建searchFilter

SearchFilter 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 SpecificationbySearchFilter(final Collectionfilters, final ClassentityClazz) {

return new Specification() {

@Override

public Predicate toPredicate(Rootroot, CriteriaQuery> query, CriteriaBuilder builder) {

if (Collections3.isNotEmpty(filters)) {

Listpredicates = 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 operator

switch (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 关键字的处理与其他不同

php gt lte gte,springdata jpa封装数据库关键字(EQ, LIKE, GT, LT, GTE, LTE,IN)相关推荐

  1. springdata jpa封装数据库关键字(EQ, LIKE, GT, LT, GTE, LTE,IN)

    数据库关键字申明,类SearchFilter: /*************************************************************************** ...

  2. SpringBoot简介、SpringBoot 入门程序搭建、与JDBC、Druid、Mybatis和SpringData JPA的整合

    一.SpringBoot 简介: spring boot并不是一个全新的框架,它不是spring解决方案的一个替代品,而是spring的一个封装.所以,你以前可以用spring做的事情,现在用spri ...

  3. 全网最全精析破解 Springboot+Jpa 对数据库增删改查

    前言: 昨天做的是springboot+mybatis 对数据库进行增删改查 但是我感觉配置文件太多了 很麻烦 繁琐 今天搞一下springboot+Jpa对数据库进行增删改查, 感觉很好用 ,所以记 ...

  4. SpringData JPA 之疑难杂症

    SpringData JPA 之疑难杂症 1.JPA自动建表不生成外键 SpringBoot项目搭配的JPA使用时候,有一对多的关系注解,那么自动会生成外键.外键在有些时候,会导致代码不能走通,我们不 ...

  5. 黑马 SpringData JPA笔记

    课程链接:https://www.bilibili.com/video/BV1Y4411W7Rx?from=search&seid=415951199875837982 第一 orm思想 ​ ...

  6. 带你搭一个SpringBoot+SpringData JPA的环境

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家对SpringBoot和Spring Da ...

  7. idea加入springboot插件_带你搭一个SpringBoot+SpringData JPA的环境

    前言 只有光头才能变强. 不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和SpringData ...

  8. SpringData JPA条件查询、排序、分页查询

    前言 在刚开始学习的时候,在dao的定义的接口需要继承JpaRepository<T, ID>接口和JpaSpecificationExecutor< T >接口,但是一直以来 ...

  9. spring boot 整合多数据源JDBC、多数据源mybatis、多数据源springdata jpa

    目录 代码地址:(spring-boot github地址) 1.springboot整合JDBC 2.springboot整合mybatis 3.springboot整合springdata jpa ...

最新文章

  1. Python读取xlsx文件报错:raise XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]+‘; not supported‘)
  2. 皮一皮:美甲的最高境界...
  3. linux pid t 头文件_Linux信号处理
  4. java libpcap,Linux下编译安装libpcap
  5. IllegalArgumentException:@Body parameters cannot be used with form or multi-part encoding
  6. slidingmenu能否实现菜单页在内容页上方,而不是把内容页挤到一边去????...
  7. C语言头文件 “ 细节 ”
  8. C语言的10大基础算法
  9. list 查找_五千字长文带你学习 二分查找算法
  10. Bailian3751 地质考察队【最值】
  11. 初始化和清理(构造器+重载/重写+this关键字)
  12. 交易学习--复盘软件及其使用方法
  13. 游戏开发中的数学基础
  14. “磁碟机”病毒肆虐 数万电脑中招
  15. php 模拟登陆微云,微云 - HHTjim'S 部落格
  16. PythonProgramming.net Python 金融教程(转)
  17. html的submitt跳转到哪,SUBMIT 用法
  18. 计算机教学模式有待创新,计算机软件教学中教学评价模式的创新与探索
  19. 设定Applocker和解决问题
  20. 1449异常 mysql_mysql异常-UncategorizedSQLException 1449

热门文章

  1. 做一个有姿态的女孩子
  2. android高级组件,Android高级组件ImageSwitcher图像切换器使用方法详解
  3. 10篇Nature专题报导人类微生物组计划2(iHMP)成果及展望
  4. R语言ggplot2可视化:ggplot2使用geom_mark_ellipse函数进行椭圆形圈定(注释)特定的数据簇或组
  5. Python使用scipy包将稀疏矩阵保存为Mtx格式和npz格式文件实战
  6. pandas生成新的累加数据列、pandas生成新的累加数据列(数据列中包含NaN的情况)、pandas计算整个dataframe的所有数据列的累加
  7. Python使用pandas设置数据列中float数据类型的有效小数位数、抑制科学计数法
  8. R语言If、Else条件语句实战
  9. python计算特征与目标的相关性并可视化
  10. R可视化包ggplot2更改背景色实战