Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CriteriaBuilder按操作结果排序_Java_Hibernate - Fatal编程技术网

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));