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