java hibernate CriteriaBuilder 转DTO

原创
2017/09/29 19:24
阅读数 218

public MemberOrderDTO getReconciliationData(Specification<MemberOrder> spec){

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<MemberOrderDTO> cq = cb
            .createQuery(MemberOrderDTO.class);
    Root<MemberOrder> customerRoot = cq.from(MemberOrder.class);
    cq.multiselect(
            cb.countDistinct(customerRoot.get("username")).alias("userNum"),
            cb.sum(customerRoot.<BigDecimal>get("price")).alias("sumMoney"),
            cb.sum(customerRoot.<BigDecimal>get("extraPayAmount")).alias("extraMoney"),
            cb.count(customerRoot.<Long>get("id")).alias("orderNum"),
            cb.sum(customerRoot.<BigDecimal>get("price")).alias("orderMoney"),
            //https://stackoverflow.com/questions/16858855/having-clause-along-with-case-when-in-criteriabuilder
            cb.sum(cb.<Integer>selectCase().when(cb.equal(customerRoot.get("extraPayFlag"), true), 1).otherwise(0))
    );
    javax.persistence.criteria.Predicate predicate =  spec.toPredicate(customerRoot,cq,cb);
    cq.where(predicate);
    TypedQuery<MemberOrderDTO> query = em.createQuery(cq);
    MemberOrderDTO dto = query.getSingleResult();
    return dto;
}
展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部