• 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")));
  • 相关阅读:
    熔断器Hystrix
    面向对象
    基础语法
    为什么需要定义数据类型???
    集成Ribbon的客户端调用工具——Feign
    Ribbon实现客户端负载均衡
    入门神经网络-Python 实现(下)
    代码视角-神经网络-Python 实现(上)
    归纳方法
    神经网络-反向传播BP算法推导
  • 原文地址:https://www.cnblogs.com/hyyq/p/7000337.html
Copyright © 2020-2023  润新知