将联接列与orderBy子句一起使用



我有一个明显的错误"ORDER BY表达式必须出现在选择列表"中;这是因为我的select distinct没有我试图排序的列(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添加到select中,但我似乎无法轻松找到允许使用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, query, criteriaBuilder);
query.distinct(true);
return predicate;
};
}
}

因为它似乎是用一个与它一起工作的存储库生成的,而原始选择只使用传递到它中的enity

有什么简单的解决方法可以用来消除错误吗?(除了完全禁用distinct(?

或者放弃整个规范,我是否应该运行一个特定的postgres查询来避免这个错误,而不是将orderBy字段放入select?

我想您想要r:中的name

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中使用了聚合函数。

最新更新