我需要按日期时间间隔聚合一些数据。我的数据库的正确 SQL 字符串如下所示:
select dttm_agg, count(id)
from table_name
group by DateTime::Format("%Y-%m-%d")(dttm) as dttm_agg;
重要的是不要在 SELECT 子句中使用转换函数,因此我必须使用别名来代替它。 我如何使用 CriteriaQuery 描述此查询?
下面的代码不起作用,我不知道如何在多选中使用别名
val cb = em.criteriaBuilder
val criteriaQuery = cb.createQuery(Any::class.java)
val root = criteriaQuery.from(TableName::class.java)
val alias = cb.function("dt_format", String::class.java, root.get<String>("dttm")).alias("dttm_agg") as Expression<*>
criteriaQuery.multiselect(
alias,
cb.count(root.get<String>("id"))
)
.groupBy(alias)
在 H2 数据库上尝试一下:
@Service
public class DateService {
private final EntityManager em;
public DateService(EntityManager em) {
this.em = em;
}
@Data
static class MyResult {
String dttm_agg;
Long countId;
}
public void getAggIdByDate() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyResult> cq = cb.createQuery(MyResult.class);
Root<DateTable> root = cq.from(DateTable.class);
Expression<String> dtf = cb.function("FORMATDATETIME", String.class, root.get("dttm"), cb.literal("Y-m-d"));
Selection<String> dtfA = dtf.alias("dttm_agg");
Expression<Long> idF = cb.count(root.get("id"));
Selection<Long> idFA = idF.alias("countId");
CriteriaQuery<MyResult> fq = cq.multiselect(dtf, idF).groupBy(dtf);
List<MyResult> r = em.createQuery(fq).getResultList();
System.out.println(r);
}
}