Spring Data JPA:使用连接表进行排序和分页

2023-11-27

我有一个场景,我想要对包含 3 个表的结果进行过滤、排序和分页。

目前,我使用 Spring Data JPA 的规范功能在单个实体上执行此操作:repository.findAll(specification, pageRequest).

这很好用,但现在我有另一种情况,其中排序/过滤属性分布在 3 个表上,这些表通过一对多关系连接。

这是我的场景:

@Entity
public class CustomerEntity ... {
  ...

  @Column(nullable = false)
  public String                                 customerNumber;

  @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, orphanRemoval = true)
  public List<CustomerItemEntity> items;
}


@Entity
public class CustomerItemEntity ... {
  ...

  @Column(nullable = false)
  public String                                 itemNumber;

  @ManyToOne(optional = false)
  @JoinColumn(name = "customerId")
  public CustomerEntity customer;

  @OneToMany(mappedBy = "item", cascade = CascadeType.ALL, orphanRemoval = true)
  public List<DocumentEntity> documents;
}


@Entity
public class DocumentEntity ... {
  ...

  @Column(nullable = false)
  public LocalDate                                 validDate;

  @ManyToOne(optional = false)
  @JoinColumn(name = "itemId")
  public CustomerItemEntity item;
}

有没有办法使用PageRequest and Specification where customerNumber, itemNumber and validDate同时用于过滤、排序和分页?


尝试这样的事情:

Specification<CustomerEntity> joins = (customer, query, cb) ->  {
    // from CustomerEntity c
    // join c.items i
    Join<CustomerEntity, CustomerItemEntity> items = customer.join("items");

    // join i.documents d
    Join<CustomerItemEntity, DocumentEntity> documents = items.join("documents");

    // // where c.customerNumber = ?1 and i.itemNumber = ?2 and d.validDate = ?3 
    return cb.and( 
            customer.equal(customer.get("customerNumber", customerNumber)),
            items.equal(items.get("itemNumber", itemNumber)), 
            documents.equal(documents.get("validDate", validDate))
    );
};

// sort by c.customerNumber asc
PageRequest pageRequest = new PageRequest(0, 2, new Sort(Sort.Direction.ASC, "customerNumber"));

Page<CustomerEntity> customerPage = CustomerRepo.findAll(joins, pageRequest);

但我不知道你为什么需要Specification here?

您可以使同样的事情变得更简单:

@Query("select c from CustomerEntity c join c.items i join i.documents d where c.customerNumber = ?1 and i.itemNumber = ?2 and d.validDate = ?3")
Page<CustomerEntity> getCustomers(String customerNumber, String itemNumber, LocaleDate validDate, Pageable pageable);  

但所有这些都没有意义,因为您的三个实体具有连续的一对多关联。在这种情况下,您可以只使用最后一个条件,而不是三个条件:where d.validDate = ?1。那么查询方法就变得更加简单了:

@Query("select c from CustomerEntity c join c.items i join i.documents d where d.validDate = ?1")
Page<CustomerEntity> getCustomers(LocaleDate validDate, Pageable pageable);

UPDATE

要按连接实体的字段添加排序,我们可以使用orderBy的方法query:

Specification<CustomerEntity> joins = (customer, query, cb) ->  {

    Join<CustomerEntity, CustomerItemEntity> items = customer.join("items");
    Join<CustomerItemEntity, DocumentEntity> documents = items.join("documents");

    // Ascending order by 'Document.itemNumber'
    query.orderBy(cb.asc(documents.get("itemNumber")));

    return cb.and( 
            customer.equal(customer.get("customerNumber", customerNumber)),
            items.equal(items.get("itemNumber", itemNumber)), 
            documents.equal(documents.get("validDate", validDate))
    );
};

Page<CustomerEntity> customerPage = CustomerRepo.findAll(joins, new PageRequest(0, 2));

要按多个参数排序,您可以将它们传递给以逗号或List:

query.orderBy(cb.asc(items.get("customerNumber")), cb.desc(documents.get("itemNumber")));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Data JPA:使用连接表进行排序和分页 的相关文章

  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 尝试在没有 GatewayIntent 的情况下访问消息内容

    我希望每当我写一条打招呼的消息时 机器人都会在控制台中响应一条消息 但它只是给我一个错误 JDA MainWS ReadThread WARN JDA Attempting to access message content without
  • 为什么 ConcurrentHashMap::putIfAbsent 比 ConcurrentHashMap::computeIfAbsent 更快?

    使用 ConcurrentHashMap 我发现computeIfAbsent 比putIfAbsent 慢两倍 这是简单的测试 import java util ArrayList import java util List import
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 如何在keycloak中动态编辑standalone.xml文件

    我正在尝试通过 docker 编辑standalone xml 并尝试添加 但 keycloak 正在使用它standalone xml 但我可以看到standalone xml 文件中的更改 我需要在standalone xml 文件中添
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • Spock模拟inputStream导致无限循环

    我有一个代码 gridFSFile inputStream bytes 当我尝试这样测试时 given def inputStream Mock InputStream def gridFSDBFile Mock GridFSDBFile
  • Path2D 上的鼠标指针检测

    我构建了一个Path2D http docs oracle com javase 7 docs api java awt geom Path2D html表示由直线组成的未闭合形状 我希望能够检测何时单击鼠标并且鼠标指针靠近路径 在几个像素
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐

  • 针对 documentId 的 Firestore 集合组查询

    在我的场景中 用户可以 喜欢 另一个用户的个人资料 因此 我为每个用户都有一个名为 likedBy 的子集合 我在其中为特定用户创建一个文档 例如 用户 col gt 用户A doc gt likeBy col gt 用户B doc 用户C
  • 当从互联网获取表的数据时,有人可以用 UItableview 来解释 MVC 吗?

    任何人都可以向我解释 MVC 在 UITableView 方面如何工作 特别是从互联网获取数据时 我很想知道 UItableview 的模型 视图和控制器是什么 我编写了以下 ViewController 代码 该代码从互联网获取数据并使用
  • 如何在 JavaScript 中解码字符串?

    这对我不起作用 var foo Collection 3A 9 Bad Interviews With Former GOP Presidential Candidates console log decodeURI foo 它输出 Col
  • 如何将Javascript变量值写入CSS?

    我怎样才能拥有time变量的内容显示为content我的 CSS 中的属性 JavaScript function clock var d new Date var hour d getHours var min d getMinutes
  • Xcode 5 IOS 模拟器黑屏且应用程序安装失败

    我刚刚更新了我的 xcode 以与 ios7 一起使用 现在 每当我制作一个新应用程序时 即使它设置为针对 ios7 构建 运行时我也会在模拟器中收到错误 它说安装失败 即使我刚刚创建了该项目并且还没有向其中编码任何内容 模拟器还显示黑屏
  • Hive 表中 count(*) 的错误结果

    我在 HIVE 中创建了一个表 CREATE TABLE IF NOT EXISTS daily firstseen analysis firstSeen STRING category STRING circle STRING specI
  • SwiftUI 聊天应用程序:颠倒列表和上下文菜单的困境

    我正在 SwiftUI 中构建一个聊天应用程序 要在聊天中显示消息 我需要一个反向列表 在底部显示最新条目并自动滚动到底部的列表 我通过翻转列表及其每个条目制作了一个反向列表 标准的做法 现在我想将上下文菜单添加到消息中 但长按后 菜单显示
  • 你能帮助我了解在 C++ 中使用 rsa.h 进行 openssl 公钥加密吗?

    我正在尝试使用 C 中 rsa 的 openssl 实现来了解公钥加密 你能帮我吗 到目前为止 这是我的想法 如有必要 请纠正 Alice 通过网络连接到 Bob 爱丽丝和鲍勃想要安全通信 Alice 生成公钥 私钥对并将公钥发送给 Bob
  • 向下滚动时隐藏固定标题,向上滚动和悬停时显示

    我有一个固定标题 它在向下滚动时隐藏并在向上滚动时再次显示 这一切都按预期工作 但我也希望当你将鼠标悬停在它的位置时它会出现 有什么想法吗 到目前为止我得到了什么 function var lastScrollTop 0 delta 5 w
  • Objective-C 中的 Mixins 还是多重继承?

    假设我有MyUITextViewSubclass它继承自UITextView and MyUITextFieldSubclass它继承自UITextField这两个子类都包含许多相同的方法和属性 以便为这些 UI 控件添加类似的行为 Sin
  • Django - 跳过数组的第一行

    我有一个相当简单的问题 但我似乎找不到简单的解决方案 我想迭代 Django 模板中的数组 但跳过第一个值 假设我有一个这样的数组 我通过视图传递给我的模板 array 1 2 3 4 5 在我的模板中我这样做 表示数组中的 A 结束 如何
  • iPhone原生数据库,iPhone上的所有数据

    是否有可能在 iPhone 上本地化一个 50MB 的大数据库 以便能够以智能的方式非常快速地搜索到它 使用 SQlite 吗 是的 您可以在 iPhone 上使用 SQLite 由于数据库只是一个文件 因此您可以将 50 MB 的文件添加
  • 如何向 Laravel 查询添加整理

    我需要运行一个查询collate utf8 bin像这样 SELECT FROM table WHERE field value collate utf8 bin 这严格适用于管理脚本 我不想更新表字符集本身 只是为了特定查询 我可以使用
  • 一段时间延迟后从触发器执行存储过程

    我想从触发器调用存储过程 如何在x分钟后执行该存储过程 我正在寻找除此之外的其他东西WAITFOR DELAY thanks 有一个定期运行并从表中提取存储过程参数的 SQL 代理作业 这些行还应指示存储过程的运行时间 因此 SQL 代理作
  • Python 日志记录:禁用堆栈跟踪

    有没有一种简单的方法可以在 Python 3 中禁用异常堆栈跟踪的日志记录 无论是在Handler or Formatter 我需要另一个中的堆栈跟踪Handler 所以设置exc info False 在调用中Logger不是一个选择 有
  • System.Text.Json 将空字符串全局序列化为空字符串

    将代码从 newtonsoft json 迁移到 system text json 时 我需要所有可为空的字符串呈现为空字符串 我编写了以下转换器 但所有空字符串值仍呈现为空 对于空字符串值 不会调用 Write 方法 断点永远不会被击中
  • Django FormWizard如何动态更改form_list

    我能够动态调用与我在前面的步骤中选择的数据相关的一个表单 但当我在done方法我可以看到我的form list保持不变 这就是我所做的 def get form list request form list None if form lis
  • R 闪亮滚动面板

    是否可以滚动 wellPanel 或列 我这里有一个简单的用户界面方案 shinyUI fluidPage sidebarLayout sidebarPanel wellPanel wellPanel mainPanel fluidRow
  • 了解Apache的访问日志

    我的访问日志中的这一行中的每一项都意味着什么 127 0 0 1 05 Feb 2012 17 11 55 0000 GET HTTP 1 1 200 140 Mozilla 5 0 Windows NT 6 1 WOW64 AppleWe
  • Spring Data JPA:使用连接表进行排序和分页

    我有一个场景 我想要对包含 3 个表的结果进行过滤 排序和分页 目前 我使用 Spring Data JPA 的规范功能在单个实体上执行此操作 repository findAll specification pageRequest 这很好