几种写法关键代码:
这个与使用@Query 类似:
Query query = entityManager.createQuery("SELECT new com.test.OperationStatisticItem( count(pl),function('date_format',pl.createdTime,'%Y-%m-%d') ,pl.action,pl.operator) from ProjectLogInfoEntity pl " +
"where pl.action <> '' " +
" group by function('date_format',pl.createdTime,'%Y-%m-%d') ,pl.operator,pl.action");
List<OperationStatisticItem> resultList = query.getResultList();
使用native query的就不写了.
推荐下面的写法:
统计每日(每人)(每种操作)的数量
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OperationStatisticItem {
private Long count;
private String date;
private ProjectLogAction action;
private String operator;
}
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<OperationStatisticItem> cq = builder.createQuery(OperationStatisticItem.class);
Root<ProjectLogInfoEntity> r = cq.from(ProjectLogInfoEntity.class);
Expression<String> createdTime = builder.function("date_format", String.class, r.get("createdTime"), builder.literal("%Y-%m-%d"));
cq.select(builder.construct(OperationStatisticItem.class, builder.count(r), createdTime, r.get("action"), r.get("operator")));
List<Predicate> predicates = new ArrayList<>();
if (projectId != null) {
predicates.add(builder.equal(r.get("projectId"), projectId));
}
if (startTime != null) {
predicates.add(builder.greaterThanOrEqualTo(r.get("createdTime"), startTime));
}
if (endTime != null) {
predicates.add(builder.lessThan(r.get("createdTime"), endTime));
}
if (operator != null) {
predicates.add(builder.lessThan(r.get("operator"), operator));
}
if (!CollectionUtils.isEmpty(actions)) {
predicates.add(r.get("action").in(actions));
}
cq.where(predicates.toArray(new Predicate[0]));
cq.groupBy(createdTime, r.get("operator"), r.get("action"));
List<OperationStatisticItem> resultList = entityManager.createQuery(cq).getResultList();