Spring 数据 JPA 规范 - 不同 + 在连接中按列排序

Spring Data JPA Specifications - Distinct + order by column in join

我有一些与“和”结合的规范:

Specification.where(predicate1).and(predicate2).and(predicate3);

其中一个有不同的集合:

query.distinct(true);

另一个在连接中的列上进行排序。

query.orderBy(builder.desc(bJoin.get("orderbyColumn")));

失败并出现 SQLGrammarException 说明按列排序应该不同。

所以基本上我们有实体 A、主要实体和一些嵌套实体 B,我们从 A select 但想按 B 排序,在生成的 sql 它只有 selects 来自 A 的列。我发现让它工作的唯一方法(= 也来自 B select)是用获取替换连接:

Fetch < A, B > bFetch = root.fetch("joinCol", JoinType.INNER);
Join < A, B > bJoin = (Join < A, B > ) bFetch;

工作了一段时间,在 H2 中进行本地测试,但一段时间后开始出现另一个错误:

org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list

我通过要求某些列不为空,在指向 H2 的本地以某种方式解决了这个问题,但在使用 PostgreSQL 的真实服务器中,它根本不起作用,在存在提取的所有情况下都会出现该错误。

我的问题是:在未获取的嵌套实体上使用 distinctorderby 的正确方法是什么?我使用 fetch 的解决方案是否可以,它只需要修复(如果是的话如何?)或者我应该完全选择另一个选项?

对于实际查询,我使用的是这种方法:

findAll(Specification<>, Pageable)

有没有办法让 distinct 用 order by(某种子查询?)包装整个查询并绕过所有这些噩梦?让它生成这样的查询:

select distinct colA1, colA2, coAl3 from (select colA1, colA2, coAl3 

from A inner join B b on ........ order by b.colB1)

我是否需要手动将我的规范转换为谓词并用它做一些其他事情来尝试解决我的问题(某种混合方法)?

任何建议都将不胜感激。

我遇到了同样的错误,但实际上不是错误:)

findAll(Specification<>, Pageable) 此方法抛出 2 个不同的查询。

第一个是计数查询,你要小心。 其次是您实际执行查询的行查询。

您可以使用以下代码查看查询类型

if (query.getResultType() != Long.class && query.getResultType() != long.class){
   root.fetch("entity1");
}