如何解决对不在SELECT DISTINCT
在执行相当复杂的查询时出现以下错误:for SELECT DISTINCT,ORDER BY expressions must appear in select list
在查询中,我需要找到所有具有Requests
的不同ExploitationSite
,其中Activity
的荷兰语或法语名称中包含搜索词。结果必须按Request
的荷兰语名称排序,并且分页的前10个字符必须限制。
要执行此查询,我使用JpaSpecificationExecutor的Page <T> findAll(Specification<T> spec,Pageable pageable)
方法。
这将导致SELECT DISTINCT查询,该查询必须由不在SELECT中的属性进行排序。 (以下详细信息)
我试图热切地获取活动,希望它将这些活动以不同的方式放置在SELECT中。我已尽力尝试在子查询中获取DISTINCT,然后围绕它进行ORDER BY + LIMIT,但是我没有成功。
有人知道如何使该查询正常工作吗?
(简化的)@Entity
@Table(name = "request_requests")
@History("Request")
public class Request extends EqualByStateObject {
@GeneratedValue
@Id
private int id;
@Embedded
private RequestNumber requestNumber;
@OneToMany(cascade = CascadeType.ALL,orphanRemoval = true)
@JoinColumn(name = "fk_request")
private List<ExploitationSite> exploitationSites = new ArrayList<>();
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(unique = true,name = "fk_activity")
private Activity activity;
...
}
实体
Request
规范(我必须在此处使用distinct,因为既然ExploitationSites
包含ExploitationSites
的列表,如果多个public class ExploitationSiteSpecification extends EqualByStateObject implements Specification<Request> {
private final String exploitationSiteName;
protected ExploitationSiteSpecification(String exploitationSiteName) {
this.exploitationSiteName = exploitationSiteName;
}
@Override
public Predicate toPredicate(Root<Request> root,CriteriaQuery<?> query,CriteriaBuilder criteriaBuilder) {
query.distinct(true);
ListJoin<Object,Object> exploitationSites = root.joinList("exploitationSites");
return criteriaBuilder.or(
criteriaBuilder.like(
criteriaBuilder.lower(exploitationSites.get("name").get("dutchName")),"%" + exploitationSiteName.toLowerCase() + "%"),criteriaBuilder.like(
criteriaBuilder.lower(exploitationSites.get("name").get("frenchName")),"%" + exploitationSiteName.toLowerCase() + "%")
);
}
}
包含搜索,那么可能有多次返回相同的请求的可能学期)
public Pageable getPageable() {
Sort sort = Sort.by(Sort.Order.asc("activity.name.dutchName"));
PageRequest.of(0,10,sort);
}
可分页
select distinct request0_.id as id1_23_,request0_.fk_activity as fk_acti15_23_,request0_.request_number as request12_23_
from request_requests request0_
inner join request_exploitation_sites exploitati1_ on request0_.id=exploitati1_.fk_request
left outer join request_activity activity2_ on request0_.fk_activity=activity2_.id
where lower(exploitati1_.dutch_name) like $1
or lower(exploitati1_.french_name) like $2
order by activity2_.dutch_name asc limit $3
这将导致生成这样的查询
for SELECT DISTINCT,ORDER BY expressions must appear in select list
然后给出<ee:cache doc:name="Cache" cachingStrategy-ref="Caching_Strategy">
<try>
<salesforce:query doc:name="Query" config-ref="Salesforce_Config">
<salesforce:salesforce-query><![CDATA[Select Id,Name from Account]]></salesforce:salesforce-query>
</salesforce:query>
<error-handler>
<on-error-continue>
....
</on-error-continue>
</error-handler>
</try>
</ee:cache>
错误
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。