按计算字段查询DSL

问题描述 投票:0回答:1

在我们的应用程序中,我们使用querydsl来获取实体并将其转换为表示对象。该表示对象具有称为active的字段。这取决于实体的某个日期是在今天之前(有效=否)还是在今天之后(有效=真)。一切顺利。问题是尝试按该表达式(QEntity.someDate > today)排序时。这会使休眠模式抛出此错误:

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

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

我也这样尝试过:

    @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();
    }

会导致类似错误:

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]

最后像这样:

    @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();
    }

与前一个抛出相同的错误

java querydsl
1个回答
0
投票

通过像这样创建order子句来解决:

    @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"

© www.soinside.com 2019 - 2024. All rights reserved.