将结合的列与orderBy子句一起使用

问题描述

我发生了一个明显的错误“ 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中使用聚合函数。