在spring data 使用中
接口: /** * 图联币管理:通过批次号,发放时间,截止时间,查询图联币发放情况。 * @author: LJ * @Create at: 2011-11-1 * @param couponIssueBatchNum * @param issueStartTime * @param issueEndTime * @param stopStartTime * @param stopEndTime * @return */ public List<CouponIssue> queryByMutiCondition(String couponIssueBatchNum, Date issueStartTime, Date issueEndTime, Date stopStartTime, Date stopEndTime);
实现:
@PersistenceContext private EntityManager em;
@Override public List<CouponIssue> queryByMutiCondition(String couponIssueBatchNum, Date issueStartTime, Date issueEndTime, Date stopStartTime, Date stopEndTime) {
CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<CouponIssue> query = builder .createQuery(CouponIssue.class); Root<CouponIssue> couponIssue = query.from(CouponIssue.class); query.select(couponIssue);
List<Predicate> predicateList = new ArrayList<Predicate>();
Predicate couponIssueBatchNumPredicate;
// 处理批次号不为空的条件,则表示用户通过批次号查询。 if ((couponIssueBatchNum != null) && (!(couponIssueBatchNum.isEmpty()))) { couponIssueBatchNumPredicate = builder .equal(couponIssue.get("couponIssueBatchNum"), couponIssueBatchNum); // builder.between(v, x, y) predicateList.add(couponIssueBatchNumPredicate); } // 发放时间处理 Predicate issueDate;
// 因为CriteriaBuilder 的比较函数传递的是expression 所以把时间构造成date类型的表达式
// 表进行传递 Expression<Date> issueStart = builder.literal(issueStartTime); Expression<Date> issueEnd = builder.literal(issueEndTime); //Expression<String> issueString = couponIssue.get("issueDate"); 2011-11-03 18:00:56 //couponIssue.get("issueDate");
// 传递的时间进行转换 EntityType<CouponIssue> ci_ = couponIssue.getModel();
if (issueStartTime != null && issueEndTime != null) { issueDate = builder .between(couponIssue.get(ci_.getSingularAttribute("issueDate", Date.class)), issueStart, issueEnd); predicateList.add(issueDate); }
Predicate[] predicates = new Predicate[predicateList.size()]; predicateList.toArray(predicates); query.where(predicates);
return em.createQuery(query).getResultList(); }
多条件分页查询
在springdata 中分页采用是返回 Page<T> 的方式:
如例子
// 接口实现 获取图联币的列表。
@Override public Page<CouponIssue> queryByMutiCondition(String couponIssueBatchNum, Date issueStartTime, Date issueEndTime, Date stopStartTime, Date stopEndTime, Pageable pageable) {
Specification<CouponIssue> spec = CouponIssueSpecs .queryByMutiCondition(couponIssueBatchNum, issueStartTime, issueEndTime, stopStartTime, stopEndTime) ; return couponIssueRepository.findAll(spec, pageable); }
方法调用:
// queryByMutiCondition public static Specification<CouponIssue> queryByMutiCondition( String couponIssueBatchNum, Date issueStartTime, Date issueEndTime, Date stopStartTime, Date stopEndTime) {
final String cibn = couponIssueBatchNum; final Date ist = issueStartTime; final Date iet = issueEndTime; final Date sst = stopStartTime; final Date set = stopEndTime;
return new Specification<CouponIssue>() {
@Override public Predicate toPredicate(Root<CouponIssue> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate pc = null; Root<CouponIssue> couponIssue = query.from(CouponIssue.class); EntityType<CouponIssue> ci_ = couponIssue.getModel(); // query.select(couponIssue);
// 存放多个条件 List<Predicate> predicateList = new ArrayList<Predicate>();
Predicate couponIssueBatchNumPredicate;
// 处理批次号不为空的条件,则表示用户通过批次号查询。 if ((cibn != null) && (!(cibn.isEmpty()))) { couponIssueBatchNumPredicate = cb.equal( couponIssue.get("couponIssueBatchNum"), cibn); // builder.between(v, x, y) predicateList.add(couponIssueBatchNumPredicate); } // 发放时间处理 Predicate issueDate;
if (ist != null && iet != null) { Expression<Date> issueStart = cb.literal(ist); Expression<Date> issueEnd = cb.literal(iet); issueDate = cb.between(couponIssue.get(ci_ .getSingularAttribute("issueDate", Date.class)), issueStart, issueEnd); predicateList.add(issueDate); }
// 截止时间处理 Predicate stopDate;
if (sst != null && set != null) { Expression<Date> stopStart = cb.literal(sst); Expression<Date> stopEnd = cb.literal(set); stopDate = cb.between( couponIssue.get(ci_.getSingularAttribute( "stopIssueDate", Date.class)), stopStart, stopEnd); predicateList.add(stopDate); } // 公共 Predicate[] predicates = new Predicate[predicateList.size()]; predicateList.toArray(predicates); CriteriaQuery<?> cqy = query.where(predicates); //Selection<?> selectionList = cqy.getSelection(); pc = cqy.getGroupRestriction(); return pc; } }; }
|