在我们的应用程序中,我们使用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,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();
}
与前一个抛出相同的错误