SpringDataJPA 查询封装

Git 地址:https://github.com/344399160/JPAManager

用过JPA查询应该都知道,实现下面接口去做查询是很痛苦的,简单的业务逻辑却要写几十行的代码,因此开始查阅各种资料,最终看了一位博主的文章后开始在他的基础上继续完善

@Override  
ublic Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {  

封装过程是参照Hibernate QBC查询做的,会QBC的同学就会这个的使用方法了,以下是一些例子,还有很多方法可以自己体验一下,如果不是做关联查询目前的功能可以涵盖大部分操作了

@Autowired  
private UserRepository userRepository;  
  
@Test  
public void getTObjectJson() {  
    Criteria<User> criteria = new Criteria<>();  
    criteria.add(Restrictions.eq("name", "test")); //等于 name = ‘test’  
    criteria.add(Restrictions.like("name", "test", Criterion.MatchMode.ANYWHERE)); //等于 name like %test%  
    criteria.add(Restrictions.between("age", 1 , 20));  //age between(1, 20)  
    criteria.add(Restrictions.isNotEmpty("name")); // ISNOTEMPTY(name)  
    List<String> list = new ArrayList();  
    list.add("Alice");  
    list.add("Mick");  
    criteria.add(Restrictions.in("name", list));  // name in ('Alice','Mick')  
  
    criteria.add(Restrictions.eq(Projections.Length("name"), 5));  // length(name) = 5  
    criteria.add(Restrictions.gt(Projections.Max("name"), 5));  // max(name) = 5  
    criteria.add(Restrictions.or(Restrictions.eq("name", "tt"),Restrictions.eq("name", "qq"))); //(name = 'tt' or name = 'qq')  
    List<User> userList = userRepository.findAll(criteria);  
}  

以下是封装代码,当时项目急用所以封装的挺粗糙的,谈不上代码美观高效。望勿怪,但是还蛮好用的,一年多了一直在用,如果有好的建议也希望能提出来,不过该封装有个问题,就是不能实现多表联查,这个挺头疼的。

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. import javax.persistence.criteria.CriteriaBuilder;  
  5. import javax.persistence.criteria.CriteriaQuery;  
  6. import javax.persistence.criteria.Predicate;  
  7. import javax.persistence.criteria.Root;  
  8.   
  9. import org.apache.commons.lang.StringUtils;  
  10. import org.springframework.data.jpa.domain.Specification;  
  11. /**  
  12.  * 定义一个查询条件容器  
  13.  *  
  14.  * @param <T>  
  15.  */    
  16. public class Criteria<T> implements Specification<T>{  
  17.     //查询条件容器  
  18.     private List<Criterion> criterions = new ArrayList<Criterion>();    
  19.     //倒序查询条件  
  20.     private String orderByDESC;  
  21.     //升序查询条件  
  22.     private String orderByASC;  
  23.     //group查询条件  
  24.     private String groupBy;  
  25.         
  26.     public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query,    
  27.             CriteriaBuilder builder) {    
  28.         if(!StringUtils.isEmpty(orderByASC))  
  29.             query.orderBy(builder.desc(root.get(getOrderByASC())));  
  30.         if(!StringUtils.isEmpty(orderByDESC))  
  31.             query.orderBy(builder.desc(root.get(getOrderByDESC())));  
  32.         if(!StringUtils.isEmpty(groupBy))  
  33.             query.groupBy(root.get(getGroupBy()));  
  34.         if (!criterions.isEmpty()) {    
  35.             List<Predicate> predicates = new ArrayList<Predicate>();    
  36.             for(Criterion c : criterions){    
  37.                 predicates.add(c.toPredicate(root, query,builder));    
  38.             }  
  39.             // 将所有条件用 and 联合起来    
  40.             if (predicates.size() > 0) {    
  41.                 return builder.and(predicates.toArray(new Predicate[predicates.size()]));    
  42.             }    
  43.         }    
  44.         return builder.conjunction();    
  45.     }    
  46.     /**  
  47.      * 增加简单条件表达式  
  48.      * @Methods Name add  
  49.      *  
  50.      */    
  51.     public void add(Criterion criterion){    
  52.         if(criterion!=null){    
  53.             criterions.add(criterion);    
  54.         }    
  55.     }    
  56.       
  57.     public void orderByDESC(String col){  
  58.         setOrderByDESC(col);  
  59.     }  
  60.       
  61.     public void orderByASC(String col){  
  62.         setOrderByASC(col);  
  63.     }  
  64.       
  65.     public void groupBy(String col){  
  66.         setGroupBy(col);  
  67.     }  
  68.       
  69.       
  70.     public String getOrderByDESC() {  
  71.         return orderByDESC;  
  72.     }  
  73.     private void setOrderByDESC(String orderByDESC) {  
  74.         this.orderByDESC = orderByDESC;  
  75.     }  
  76.     public String getOrderByASC() {  
  77.         return orderByASC;  
  78.     }  
  79.     private void setOrderByASC(String orderByASC) {  
  80.         this.orderByASC = orderByASC;  
  81.     }  
  82.     public String getGroupBy() {  
  83.         return groupBy;  
  84.     }  
  85.     private void setGroupBy(String groupBy) {  
  86.         this.groupBy = groupBy;  
  87.     }  
  1. import javax.persistence.criteria.CriteriaBuilder;  
  2. import javax.persistence.criteria.CriteriaQuery;  
  3. import javax.persistence.criteria.Predicate;  
  4. import javax.persistence.criteria.Root;  
  5. /**  
  6.  * 条件接口  
  7.  * 用户提供条件表达式接口  
  8.  */    
  9. public interface Criterion {  
  10.     public enum Operator {    
  11.         EQ, NE, LIKE, GT, LT, GTE, LTE, AND, OR, BETWEEN, ISNULL, ISNOTNULL, ISEMPTY, ISNOTEMPTY  
  12.     }  
  13.       
  14.     public enum MatchMode {    
  15.         START, END, ANYWHERE  
  16.     }    
  17.       
  18.     public enum Projection {  
  19.         MAX, MIN, AVG, LENGTH, SUM, COUNT  
  20.     }  
  21.       
  22.     public Predicate toPredicate(Root<?> root, CriteriaQuery<?> query,  
  23.                                  CriteriaBuilder builder);  

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. import javax.persistence.criteria.CriteriaBuilder;  
  5. import javax.persistence.criteria.CriteriaQuery;  
  6. import javax.persistence.criteria.Expression;  
  7. import javax.persistence.criteria.Predicate;  
  8. import javax.persistence.criteria.Root;  
  9.   
  10. import org.springframework.util.StringUtils;  
  11.   
  12. /**  
  13.  * 逻辑条件表达式 用于复杂条件时使用,如但属性多对应值的OR查询等  
  14.  *  
  15.  */    
  16. public class LogicalExpression implements Criterion {  
  17.     private Criterion[] criterion;  // 逻辑表达式中包含的表达式    
  18.     private Operator operator;      //计算符  
  19.     private String col;  
  20.     private Object exp1;  
  21.     private Object exp2;  
  22.         
  23.     public LogicalExpression(Criterion[] criterions, Operator operator) {    
  24.         this.criterion = criterions;    
  25.         this.operator = operator;    
  26.     }    
  27.       
  28.     //between用构造方法  
  29.     public LogicalExpression(String col, Object exp1, Object exp2, Operator operator){  
  30.         this.col = col;  
  31.         this.exp1 = exp1;  
  32.         this.exp2 = exp2;  
  33.         this.operator = operator;  
  34.         this.criterion = null;  
  35.     }  
  36.       
  37.     public Predicate toPredicate(Root<?> root, CriteriaQuery<?> query,    
  38.             CriteriaBuilder builder) {    
  39.         List<Predicate> predicates = new ArrayList<Predicate>();    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值