首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QueryDSL按计算字段排序

QueryDSL按计算字段排序
EN

Stack Overflow用户
提问于 2019-11-29 21:58:58
回答 1查看 375关注 0票数 0

在我们的应用程序中,我们使用querydsl来获取实体并将其转换为表示对象。这个表示对象有一个名为active的字段。这取决于实体的某个日期是在今天之前(active = false)还是在今天之后(active = true)。这样做一切都很顺利。问题出在尝试按该表达式(QEntity.someDate > today)排序时。这使得hibernate抛出这个错误:

代码语言:javascript
复制
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: > near line 3, column 40 [select object.someField as someAlias, (object.someDate > ?1) as active, object as objectAlias
from com.example.Object object
order by object.someDate > ?1 asc]

我按如下方式创建OrderSpecifier

代码语言:javascript
复制
    @Override
    public OrderSpecifier<?> getOrderByClause(SortKey sortKey) {
        BooleanExpression expression = getBooleanPath(); // This is the expression: (object.someDate > ?1)
        if (sortKey.getSortOrder() == ESortOrder.ASCENDING) {
            return new OrderSpecifier(Order.ASC, expression);
        }
        return new OrderSpecifier(Order.DESC, expression);
    }

我也是这样试过的:

代码语言:javascript
复制
    @Override
    public OrderSpecifier<?> getOrderByClause(SortKey sortKey) {
        BooleanExpression expression = getBooleanPath();
        if (sortKey.getSortOrder() == ESortOrder.ASCENDING) {
            return new CaseBuilder().when(expression.isFalse()).then(1).otherwise(2).asc();
        }
        return new CaseBuilder().when(expression.isTrue()).then(1).otherwise(2).desc();
    }

这会导致类似的错误:

代码语言:javascript
复制
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: > near line 3, column 40 [select object.someField as someAlias, (object.someDate > ?1) as active, object as objectAlias
from com.example.Object object
order by case when (object.someDate > ?1 = ?2) then ?3 else 2 end asc]

最后像这样:

代码语言:javascript
复制
    @Override
    public OrderSpecifier<?> getOrderByClause(SortKey sortKey) {
        BooleanExpression expression = getBooleanPath();
        if (sortKey.getSortOrder() == ESortOrder.ASCENDING) {
            return new CaseBuilder().when(expression.eq(true)).then(1).otherwise(2).asc();
        }
        return new CaseBuilder().when(expression.eq(true)).then(1).otherwise(2).desc();
    }

,它抛出的错误与前面的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-29 22:44:13

通过创建如下所示的order子句修复该问题:

代码语言:javascript
复制
    @Override
    public OrderSpecifier<?> getOrderByClause(SortKey sortKey) {
        BooleanPath path = getBooleanPath();
        if (sortKey.getSortOrder() == ESortOrder.ASCENDING) {
            return path.asc();
        }
        return path.desc();
    }

    private BooleanPath getBooleanPath() {
        return Expressions.booleanPath(getFieldName());
    }

其中,字段名是字符串的别名,在本例中为"active"

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59106196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档