1.创建接受结果集实体类
public class JpaCountResult {
private String createTime;
private Integer count;
public JpaCountResult(String createTime, Integer count) {
this.createTime = createTime;
this.count = count;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
}
2.根据日期分组
jpaFormat为指定日期格式:按年:%Y,按月:%Y-%m,按日:%Y-%m-%d
@Autowired
private EntityManager entityManager;
private List<JpaCountResult> getJpaCountResult(String jpaFormat, String startTime,
String endTime) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<JpaCountResult> query = cb.createQuery(JpaCountResult.class);
Root<?> root = query.from(ApiReportFiles.class);
List<Predicate> predicates = new ArrayList<>();
//过滤条件
if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) {
startTime = startTime + " 00:00:00";
endTime = endTime + " 23:59:59";
Predicate predicate = cb.between(root.get("createTime").as(String.class),
startTime, endTime);
predicates.add(predicate);
}
Predicate[] predicateArr = new Predicate[predicates.size()];
predicateArr = predicates.toArray(predicateArr);
query.where(cb.and(predicateArr));
Expression<String> timeStr = cb.function("DATE_FORMAT", String.class,
root.get("createTime"), cb.parameter(String.class, "formatStr"));
query.multiselect(timeStr, cb.count(root).as(Integer.class));
query.groupBy(timeStr);
query.orderBy(cb.asc(timeStr));
TypedQuery<JpaCountResult> typedQuery = entityManager.createQuery(query);
typedQuery.setParameter("formatStr", jpaFormat);
return typedQuery.getResultList();
}