问题描述
我发生了一个明显的错误“ ORDER BY表达式必须出现在选择列表中”,这是因为我的选择不同项没有我要按(d.name
)进行排序的列,从另一个表中加入:
select distinct r.id,r.name
from record r
inner join dict d on r.status_id = d.id
order by d.name desc
最明显的解决方案是将d.code
添加到选择中,但我似乎无法轻易找到允许使用rSQL查询解析器执行此操作的解决方案,
public Specification<T> parseQuery(String searchQuery,boolean distinct,ZoneId timeZone) {
if(Strings.isNullOrEmpty(searchQuery)) {
return null;
}
Node rootNode = new RsqlParser(operators).parse(searchQuery);
final Specification<T> accept = rootNode.accept(new CustomrsqlVisitor<>(timeZone));
if (!distinct || accept == null) {
return accept;
} else {
return (root,query,criteriaBuilder) -> {
Predicate predicate = accept.toPredicate(root,criteriaBuilder);
query.distinct(true);
return predicate;
};
}
}
因为它似乎已被与其一起使用的存储库所泛化,并且原始选择仅使用已传递给它的实体。
我可以使用任何简单的解决方法来使错误消失吗? (除了完全停用其他功能)?
还是放弃整个规范,是否有一个特定的postgres查询应该运行以避免该错误,而不是将orderBy字段置为select?
解决方法
我假设您想要name
中的r
:
select distinct r.id,r.name
from record r join
dict d
on r.status_id = d.id
order by r.name desc;
编辑:
仔细检查问题表明您确实想要d.code
。如果您确实希望从d
中取消选择列,则可以使用group by
:
select r.id,r.name
from record r join
dict d
on r.status_id = d.id
group by r.id,r.name
order by max(d.code) desc;
请注意在order by
中使用聚合函数。