JPA Criteria Api:在 SELECT 中使用 GROUP BY 的别名

问题描述 投票:0回答:1

我需要按日期时间间隔聚合一些数据。我的数据库的正确 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)
spring hibernate group-by alias jpa-criteria
1个回答
0
投票

在 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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.