本篇前提:html
這篇文章中的第二種方法 實現Specification 這塊的方法 只適用於一個對象針對某一個固定字段查詢,下面經過泛型改寫了這個方法:java
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泛型,實現了基本的查詢通用方法。spring
該類中第一個方法getSpec(SingularAttribute<? super T,Y> sa, Integer parameter) 傳入一個SingularAttribute和對應的int參數;dom
第二個方法getSpec2(SingularAttribute<? super T,Y> sa,List<Integer> parameters) 傳入一個SingularAttribute和對應的int參數集合。ide
第一個方法適用於對單張表只有一個int條件的狀況,而第二個方法適用於對單張表有多個int條件的狀況。post
使用:ui
第一個方法的使用:url
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")));
第二個方法的使用:spa
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")));