如何使用Criteria Builder在+订单时创建临时列+

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

这是我想在jpa中翻译的sql语句:

  select 
        id,
        act_invalidation_id, 
        last_modification_date,
        title,
        case when act_invalidation_id is null then 1 else 0 end as test
    from act order by test, last_modification_date desc

实际的翻译

Root<Act> act = query.from(Act.class);

builder.selectCase()
                .when(builder.isNull(actRoot.get("actInvalidation")), 1)
                .otherwise(0).as(Integer.class);
Expression<?> actInvalidationPath = actRoot.get("actInvalidation");
Order byInvalidationOrder = builder.asc(actInvalidationPath);

Path<Date> publicationDate = actRoot.get("metadata").get("publicationDate");
Order byLastModificationDate = builder.desc(publicationDate);

query.select(act).orderBy(byInvalidationOrder, byLastModificationDate);
entityManager.createQuery(query).getResultList();

我尝试创建一个Integer类型的临时列(命名测试)并按此列排序,然后命令lastbyificationdate。此新列的内容由actInvalidation字段的值确定。

简而言之:如何使用整数值创建临时列,然后在jpa中按此临时列排序?

谢谢

sql-order-by hibernate-criteria temp-tables
1个回答
1
投票

我没有测试这个,但它应该像这样工作:

Root<Act> act = query.from(Act.class);

Expression<?> test = builder.selectCase()
                .when(builder.isNull(actRoot.get("actInvalidation")), 1)
                .otherwise(0).as(Integer.class);
Expression<?> actInvalidationPath = actRoot.get("actInvalidation");
Order byInvalidationOrder = builder.asc(actInvalidationPath);

Path<Date> publicationDate = actRoot.get("metadata").get("publicationDate");
Order byLastModificationDate = builder.desc(publicationDate);

Order byTest = builder.asc(test);

query.select(act).orderBy(byTest, byInvalidationOrder, byLastModificationDate);
entityManager.createQuery(query).getResultList();
© www.soinside.com 2019 - 2024. All rights reserved.