当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA规范-Distinct+order by column in

田文景
2023-03-14
Specification.where(predicate1).and(predicate2).and(predicate3);
query.distinct(true);
query.orderBy(builder.desc(bJoin.get("orderbyColumn")));

如果SQLGrammarException声明order by列应该在DISTINCT中,则会失败。

所以基本上我们有实体A、主实体和一些嵌套实体B,我们从A中选择,但希望按B排序,在生成的sql中,它只从A中选择列。我找到的使它工作的唯一方法(=使它也从B中选择)是用fetch替换联接:

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

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

queryException:查询指定了连接提取,但是提取的关联的所有者不在选择列表中

我在指向H2的本地中通过要求某些列不为null解决了这个问题,但在使用PostgreSQL的实际服务器中,它根本不起作用,当存在fetch时,所有情况下都会出现这个错误。

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

findAll(Specification<>, Pageable)
select distinct colA1, colA2, coAl3 from (select colA1, colA2, coAl3 

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

任何建议都将不胜感激。

共有1个答案

贝阳泽
2023-03-14

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

findAll(规范<>,可分页)此方法抛出2个不同的查询。

首先是必须小心的计数查询。其次是实际执行的行查询。

if (query.getResultType() != Long.class && query.getResultType() != long.class){
   root.fetch("entity1");
} 
 类似资料:
  • Number,String,Boolean和Object 不要使用如下类型Number,String,Boolean或Object。 这些类型指的是非原始的装盒对象,它们几乎没在JavaScript代码里正确地使用过。 /* 错误 */ function reverse(s: String): String; 应该使用类型number,string,and boolean。 /* OK */ fu

  • 参数规范 参数前带* 表示必填 参数命名采用小写加下划线形式 请求每个接口时,在 header里带上 XX-Token(用户 token),XX-Device-Type(类型:mobile,android,iphone,ipad,web,pc,mac,wxapp),XX-Api-Version(比如1.0.0),XX-Wxapp-AppId(小程序 AppId) 返回结果 参数命名采用小写加下划线

  • 公司及产品名称 我们的公司及产品名称是「DaoCloud」。注意这是两个单词的合成词,所以中间沒有空格(参考:GitHub)。如作为 URL 的一部分,应该使用全小写的「daocloud」。 文案风格 一定多检查,确保没有错别字。 即使是流行语中的谐音错别字也不要使用,比如「墙裂」、「童鞋」等。 我们崇尚精练的文风。请在检查中把对表达意思没有明显作用的字、词、句删除,在不影响表达效果的前提下把文案

  • AMD(异步模块定义)是为浏览器环境设计的,因为 CommonJS 模块系统是同步加载的,当前浏览器环境还没有准备好同步加载模块的条件。 AMD 定义了一套 JavaScript 模块依赖异步加载标准,来解决同步加载的问题。 模块通过 define 函数定义在闭包中,格式如下: define(id?: String, dependencies?: String[], factory: Functi

  • CommonJS 是以在浏览器环境之外构建 JavaScript 生态系统为目标而产生的项目,比如在服务器和桌面环境中。 这个项目最开始是由 Mozilla 的工程师 Kevin Dangoor 在2009年1月创建的,当时的名字是 ServerJS。 我在这里描述的并不是一个技术问题,而是一件重大的事情,让大家走到一起来做决定,迈出第一步,来建立一个更大更酷的东西。 —— Kevin Dango

  • 本文向大家介绍PE8规范相关面试题,主要包含被问及PE8规范时的应答技巧和注意事项,需要的朋友参考一下     各种右括号前不要加空格。 逗号、冒号、分号前不要加空格。 函数的左括号前不要加空格。如Func(1) 序列的左括号前不要加空格。如list[2] 操作符左右各加一个空格,不要为了对齐增加空格 函数默认参数使用的赋值符左右省略空格 不要将多句语句写在同一行,尽管使用‘;’允许 if/for