public MemberOrderDTO getReconciliationData(Specification spec){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb
.createQuery(MemberOrderDTO.class);
Root customerRoot = cq.from(MemberOrder.class);
cq.multiselect(
cb.countDistinct(customerRoot.get("username")).alias("userNum"),
cb.sum(customerRoot.get("price")).alias("sumMoney"),
cb.sum(customerRoot.get("extraPayAmount")).alias("extraMoney"),
cb.count(customerRoot.get("id")).alias("orderNum"),
cb.sum(customerRoot.get("price")).alias("orderMoney"),
//https://stackoverflow.com/questions/16858855/having-clause-along-with-case-when-in-criteriabuilder
cb.sum(cb.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 query = em.createQuery(cq);
MemberOrderDTO dto = query.getSingleResult();
return dto;
}