假设以下实体:
Entity {
Integer id;
Boolean imported;
Integer status;
}
任务是:选择具有imported = true
和status != 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
答案 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