Java 使用规范的查询在对不在SELECT DISTINCT中的联接列排序时出错

Java 使用规范的查询在对不在SELECT DISTINCT中的联接列排序时出错,java,spring,postgresql,hibernate,jpa,Java,Spring,Postgresql,Hibernate,Jpa,在执行相当复杂的查询时,我遇到以下错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在SELECT列表中 在查询中,我需要找到所有不同的请求,它们的剥削站点以荷兰语或法语名称包含搜索词。结果必须按活动的荷兰语名称排序,并限制在前10个页码内 要执行此查询,我使用JpaSpecificationExecutor的方法 这将导致SELECT DISTINCT查询,该查询必须由不在SELECT中的属性排序。(详情如下) 我迫不及待地想把这些活动拿出来,希望它能把这些活动放在不同的

在执行相当复杂的查询时,我遇到以下错误:
对于SELECT DISTINCT,ORDER BY表达式必须出现在SELECT列表中

在查询中,我需要找到所有不同的
请求
,它们的
剥削站点
以荷兰语或法语名称包含搜索词。结果必须按
活动
的荷兰语名称排序,并限制在前10个页码内

要执行此查询,我使用JpaSpecificationExecutor的方法

这将导致SELECT DISTINCT查询,该查询必须由不在SELECT中的属性排序。(详情如下)

我迫不及待地想把这些活动拿出来,希望它能把这些活动放在不同的地方。我尽了最大的努力在子查询中获得DISTINCT,然后让orderby+限制围绕它,但我没有成功

有人知道我如何让这个查询工作吗

(简化的)
请求
实体

@实体
@表(name=“request\u requests”)
@历史记录(“请求”)
公共类请求扩展EqualByStateObject{
@生成值
@身份证
私有int-id;
@嵌入
私人请求号码请求号码;
@OneToMany(cascade=CascadeType.ALL,orphan=true)
@JoinColumn(name=“fk_请求”)
private List剥削站点=新建ArrayList();
@OneToOne(级联=级联类型.ALL)
@JoinColumn(unique=true,name=“fk_活动”)
私人活动;
...
}
规范(我必须在这里使用distinct,因为
请求
包含一个
利用网站的列表
,如果多个
利用网站
包含搜索词,我可能多次收到相同的请求)

公共类利用SiteSpecification扩展EqualByStateObject实现规范{
私有最终字符串剥削SiteName;
受保护的剥削SiteSpecification(字符串剥削SiteName){
this.剥削SiteName=剥削SiteName;
}
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder CriteriaBuilder){
query.distinct(true);
ListJoin-剥削站点=root.joinList(“剥削站点”);
返回标准生成器(
标准化(
criteriaBuilder.lower(剥削网站.get(“名称”).get(“dutchName”),“%”“+”剥削网站名.toLowerCase()+“%”,
标准化(
criteriaBuilder.lower(剥削网站.get(“name”).get(“frenchName”),“%”“%”+剥削网站名.toLowerCase()+“%”)
);
}
}
可寻呼

public Pageable getPageable(){
Sort Sort=Sort.by(Sort.Order.asc(“activity.name.dutchName”);
PageRequest.of(0,10,排序);
}
这将导致生成一个如下所示的查询

选择不同的请求0.id作为id1\u 23\u,
请求0_u.fk_活动作为fk_活动15_u23_u,
请求0。请求编号为请求12\u 23_
来自请求\u请求请求0\u
内部连接请求\u利用\u站点利用1\u在请求0\u.id=利用1\u.fk\u请求上
请求0上的左外部联接请求\活动activity2\ fk\活动=activity2\ id
其中较低的(开发1.荷兰语名称)如1美元
或更低(剥削1.法文名称),如2美元
按活动订购2荷兰名称asc限额$3

这就给出了
对于SELECT DISTINCT,ORDER BY表达式必须出现在SELECT列表中
error

您需要选择
dutch_name
也可以按该列进行排序我希望这样简单,但是直接更改查询很困难,因为它是自动生成的。您可以为distinct
query.multiselect(剥削网站.get(“id”)、剥削网站.get(“name”).get(“dutchName”))多选列。distinct(true)它看起来很有希望,但不幸的是,它没有改变生成的查询