Java CriteriaBuilder按操作结果排序
假设以下实体:Java CriteriaBuilder按操作结果排序,java,hibernate,Java,Hibernate,假设以下实体: Entity { Integer id; Boolean imported; Integer status; } 任务是:选择实体时,选择那些具有imported=true和状态!=1应位于搜索结果的底部。还需要使用CriteriaBuilder 我决定计算一个值,该值将指示它们被以下表达式拉下:imported=true和status!=1 如果编写direct SQL,它将按预期工作,请查看: SELECT .. FROM .. ORDER BY (
Entity {
Integer id;
Boolean imported;
Integer status;
}
任务是:选择实体时,选择那些具有imported=true
和状态!=1
应位于搜索结果的底部。还需要使用CriteriaBuilder
我决定计算一个值,该值将指示它们被以下表达式拉下:imported=true和status!=1
如果编写direct 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 case when ( entity.imported=true ) and ( entity.status<>1 ) then 1 else 0 end asc
生成的查询如下所示:
order by ( generatedAlias0.imported=:param2 ) and ( generatedAlias0.status<>:param3 ) asc
order by(generatedAlias0.imported=:param2)和(generatedAlias0.status:param3)asc
但是当execute抛出异常时,会说:“意外的AST节点”指向令牌和
是否有一种使用CriteriaBuilder
按计算值进行排序的方法,以及需要做什么
添加:Hibernate ORM版本:4.3.5我使用
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));