zoukankan      html  css  js  c++  java
  • Spring data jpa 实现简单动态查询的通用Specification方法

    本篇前提:

    SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

    这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字段查询,下面通过泛型改写了这个方法:

    import java.util.List;
    
    import javax.persistence.criteria.CriteriaBuilder;
    import javax.persistence.criteria.CriteriaQuery;
    import javax.persistence.criteria.Predicate;
    import javax.persistence.criteria.Root;
    import javax.persistence.metamodel.SingularAttribute;
    
    import org.springframework.data.jpa.domain.Specification;
    
    /**
     *create by yyc 2017年6月12日下午3:26:25
     */
    public class SpecificationUtil {
        public static <T, Y> Specification<T> getSpec(SingularAttribute<? super T,Y> sa, Integer parameter){
            return new Specification<T>() {
    
                @SuppressWarnings("unused")
                @Override
                public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                    Predicate p1 = null;
                    if (-1 != parameter ) {
                        Predicate p2 = cb.equal(root.get(sa), parameter);
                        if (p1 != null) {
                            p1=cb.and(p1, p2);
                        } else {
                            p1 = p2;
                        }
                    }
                    return p1;
                }
            };
        }
        public static <T, Y> Specification<T> getSpec2(SingularAttribute<? super T,Y> sa,List<Integer> parameters){
            return new Specification<T>() {
                
                @Override
                public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                    Predicate p1 = null;
                    if (null != parameters ) {
                        Predicate p2=null;
                        for (Integer parameter : parameters) {    
                             p2= cb.equal(root.get(sa), parameter);
                            if (p1 != null) {
                                p1=cb.and(p1, p2);
                            }else {
                                p1 = p2;
                            }
                        }
                    }
                    return p1;
                }
            };
        }
    }

    利用 java泛型,实现了基本的查询通用方法。

    该类中第一个方法getSpec(SingularAttribute<? super T,Y> sa, Integer parameter)  传入一个SingularAttribute和对应的int参数;

    第二个方法getSpec2(SingularAttribute<? super T,Y> sa,List<Integer> parameters) 传入一个SingularAttribute和对应的int参数集合。

    第一个方法适用于对单张表只有一个int条件的情况,而第二个方法适用于对单张表有多个int条件的情况。

    使用:

    第一个方法的使用:

    SpecificationUtil.getSpec(Company_.acCode, areacode)就是调用这个方法,根据areacode这个字段进行查询,finAll方法的第二个参数是关于分页和排序的了。
    Repository.findAll(SpecificationUtil.getSpec(Company_.acCode, areacode),
                        new PageRequest(vo.getPage(), vo.getSize(), new Sort(Direction.ASC, "comId")));

    第二个方法的使用:

    SpecificationUtil.getSpec2(Waterdtudev_.comId, companyIds)根据多个comId进行查询,comId是一个Integer型的,companyIds就是一个List<Integer>。
    Repository.findAll(SpecificationUtil.getSpec2(Waterdtudev_.comId, companyIds), 
                new PageRequest(vo.getPage(), vo.getSize(), new Sort(Direction.ASC, "wdId")));
  • 相关阅读:
    Day5:面向对象的定义(下)
    SQL 查询中not in 与 not exists 的区别
    SQL 语句的执行顺序
    SQL server 连接 查询
    SQL server 约束
    静态类与非静态类,静态成员及使用方法
    HR面试总结
    值类型与引用类型精解
    面试技巧
    MVC与设计模式的关系及MVC的实现原理和设计原理
  • 原文地址:https://www.cnblogs.com/hyyq/p/7000337.html
Copyright © 2011-2022 走看看