CriteriaBuilder按操作结果排序

时间:2017-03-29 11:27:22

标签: java hibernate

假设以下实体:

Entity {
    Integer id;
    Boolean imported;
    Integer status;
}

任务是:选择具有imported = truestatus != 1的实体时,应该转到搜索结果的底部。还必须使用CriteriaBuilder

我决定计算一个值,表示它们会被下面的表达式拉下来:imported = true AND status != 1

如果编写直接SQL,它可以按预期工作:

SELECT .. FROM .. ORDER BY (imported = true AND status != 1) ASC

但我无法在CriteriaBuilder

的上下文中对其进行转码

我试着这样做:

Predicate eqTruePredicate = cb.equal(root.get(Entity_.imported), true);
Predicate neqStatusPredicate = cb.notEqual(root.get(Entity_.status)), 1);

Predicate andExp = cb.and(eqTruePredicate, neqStatusPredicate);
order.add(0, new OrderImpl(cb.isTrue(andExp)));

生成的查询如下:

order by ( generatedAlias0.imported=:param2 ) and ( generatedAlias0.status<>:param3 ) asc

但是当执行异常时抛出说:“意外的AST节点”指向令牌and

是否有办法使用CriteriaBuilder按计算值执行排序,以及需要做什么?

添加: Hibernate ORM版本:4.3.5

1 个答案:

答案 0 :(得分:0)

我设法使用CASE声明:

Expression<Integer> caseExp = cb.<Integer>selectCase()
    .when(
        cb.and(
            cb.equal(root.get(Entity_.imported), true),
            cb.notEqual(root.get(Entity_.status), 1)
        ),
        1
    )
    .otherwise(0);

order.add(0, cb.asc(caseExp));

这导致ORDER BY语句如下:

order by case when ( entity.imported=true ) and ( entity.status<>1 ) then 1 else 0 end asc