Spring Data Rest 中嵌套资源的分页

2023-12-13

当访问以下 URL 时,我会收到分页响应

/api/userPosts/

{
  "_links" : {
    "self" : {
      "href" : "/api/userPosts{?page,size,sort}",
      "templated" : true
    },
    "next" : {
      "href" : api/userPosts?page=1&size=20{&sort}",
      "templated" : true
    }
  },
  "_embedded" : {
    "userPosts" : [ {
     ...

但是,当访问以下 URL 时,Spring Data REST 没有开箱即用的分页 -

/api/users/4/userPosts

{
  "_embedded" : {
    "userPosts" : [ {

UserRepository 和 UserPostRepository 都是带分页功能的 JPARepository。因此,第二个 URL 会抛出 GC 开销超出错误,因为返回结果的行数很大。

@RepositoryRestResource(excerptProjection = UserProjection.class)
public interface UserRepository extends BaseRepository<User, Integer>, UserRepositoryCustom {

}

public interface UserPostRepository extends BaseRepository<UserPost, Long> {

}


@NoRepositoryBean
public interface BaseRepository<T, N extends Serializable> extends JpaRepository<T, N>, QueryDslPredicateExecutor<T> {

}

有什么办法也可以使用第二个 URL 进行分页吗?


简短而痛苦的回答:不。绝对不。

冗长甚至更痛苦的回答:是的。通过重写 Spring Data、JPA 和 Hibernate 的大部分内容。 问题的核心是,当您请求嵌套实体(集合或非集合)时,该嵌套实体不是来自存储库的查询。但它是从实体返回的。 Spring Data / JPA 中没有用于分页的机制

Spring REST 中 /api/users/4/user Posts 请求的作用基本上是这样的:

User user = userRepository.findOne(4);
return user.userPosts;

因此,检索 user.userPosts 是对嵌套实体的急切或惰性引用,并且无法对其进行分页。

实现这一目标的最简单且唯一的解决方案是: 1.创建Spring Data搜索查询:UserPostRepository.findByUserId(Long id, Pagination pa) 2. 创建自定义 Spring MVC 控制器用于映射

   @Get("/api/users/{id}/userPosts")
   public Page<UserPost> getUserPostsByUserId(Long id, Pagination pagi) {
     return userPostRepository.findByUserId(id, pagi);
  1. 重要的!你不能!将 user.userPosts 注释为嵌套在 User 实体中,否则请求映射将会发生冲突。
  2. 如果您想要用户实体 JSON 中此路径的导航超链接,那么您需要 用户实体 JSON 创建的自定义处理。它的文档很少,并且没有一个示例涵盖您需要稍微探索一下的确切用例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Data Rest 中嵌套资源的分页 的相关文章

随机推荐

  • 在 CIFilter 中使用 CIColor 中的 CIImage:获取空图像

    我正在尝试创建一个具有混合模式 如叠加或乘法 的 CIFilter 相关代码 Let s try a filter here Get the data NSData imageData UIImageJPEGRepresentation i
  • 从周数查找一周的开始结束日期

    我使用 servlet 和 JSP 构建了一个 Web 应用程序 并在 Servlet 内计算了周数 private int findWeekNumber String myDate throws ParseException Simple
  • Auto Div 高度取决于另一高度

    我有以下情况我希望 Div2 高度根据 Div3 的内容调整大小 我怎样才能做到这一点 DIV1 DIV2 DIV3
  • Chrome 扩展程序可从脚本中提取文本

    我正在尝试使用 Chrome 扩展的 JS 从脚本标记中提取 webId 22 22 var 字符串 我当前正在使用的示例允许我提取页面标题 payload js chrome runtime sendMessage document ti
  • 根据另一个数据框更改数据框的值

    我再次需要您的帮助来解决一个对于初学者 R 用户来说不太清楚的可能简单的问题 我需要操作一个数据框来替换NA值由 现实 的值来满足另一个应用程序 数据帧包含 3 0 的值 这是原始数据库中无效值的标志 我需要的是用来自另一个数据帧的数据替换
  • 如何在 Touch UI 中添加强制下拉字段

    我将 必需 添加为 真实 但它不起作用 required 为 true 仅适用于文本字段 根据下面的文档 我没有看到任何从下拉列表中添加必填字段的选项 http docs adobe com docs en aem 6 0 author a
  • 为什么 Promise.then 'onFulfilled' 函数在 setTimeout 回调之前触发? [复制]

    这个问题在这里已经有答案了 有人可以解释为什么 Promise then 函数在 setTimeout 函数之前触发吗 我本以为 setTimeout 函数会首先安排在事件循环上 所以它会在 Promise then 函数之前运行 setT
  • 运算符如何重载|专门实现了 C++ 范围适配器?

    自从范围被合并到 C 20 中以来 我一直在查看标题以了解如何operator 对于范围视图来说超载 但我找不到关于如何或在何处实现它的正确轨道 C R 相当于R C根据https en cppreference com w cpp ran
  • Makefile - 移动目标文件

    经过一番搜索后 我成功地将以下 Makefile 放在一起 CC gcc CFLAGS c Wall LDFLAGS SOURCEFILES main c SOURCES src SOURCEFILES OBJECTS SOURCES c
  • Codeigniter 2.1.3 的 SMTP Gmail 错误

    我看过很多与此问题相关的帖子 我已经完成了给出的说明 但总是遇到相同的错误 我想使用 Code Igniter 2 1 3 发送 smtp gmail 这是代码 class Email extends CI Controller funct
  • 使用 SSIS 压缩文件夹

    我正在尝试压缩 SSIS 中的一个文件夹 源文件夹中有 12 个文件 我需要压缩该文件夹 我可以很好地压缩文件 我的问题是文件夹 我必须使用 winzip 来创建压缩包 谁能给我指点一个好的教程 我无法实现我找到的任何示例 Thanks 添
  • 将字典拆分为 df 中的各个列[重复]

    这个问题在这里已经有答案了 我有以下内容df其值是字典 tests SO4 Mon 6 Tues 6 Wed 7 CH3 Mon 0 Tues 8 Wed 10 我想获得所需的输出 0 1 2 SO4 Mon 6 Tues 6 Wed 7
  • Android:如何根据首先选择的单选按钮启用/禁用复选框

    基本上我有一个带有两个单选按钮的单选组 其中一个标记为 运行 另一个标记为 通过 就在其下方 我还有一个标记为 通过完成 的复选框 问题 如何在选择 运行 单选按钮时禁用该复选框 因此无法选择该复选框 并在选择 通过 单选按钮时启用它 任何
  • 无法将数组项传递给 PhantomJS 中的函数

    我正在尝试将源代码同时提取到多个网页 这些链接通过源文本文件输入到数组中 我能够迭代数组并打印出链接并确认它们存在 但是当尝试通过函数传递它们时 它们在第一次迭代后变得未定义 我的最终目标是将每个页面的源代码保存到自己的文档中 它正确执行第
  • 将打印按钮添加到 Inno Setup 中的许可证页面(Inno Setup 6 重新访问)

    这是一个标准 RTF 文档 用于LicenseFile财产在 Setup Inno 设置部分 是否可以在此页面添加一个打印按钮来触发打印许可协议 我看到了类似的问题和答案 在 Inno Setup 的许可页面中添加 打印协议 按钮 我刚刚尝
  • 将 Trace 方法添加到 System.Diagnostics.TraceListener

    我编写了一个从 System Diagnostics TraceListener 派生的 Log 类 如下所示 public class Log TraceListener 它充当 Log4Net 的包装器 并允许人们像这样使用 Syste
  • 如何在 bigquery 中取消嵌套结构数组的字符串?

    bigquery 方法 当 option name 为 labels 时 INFORMATION SCHEMA TABLE OPTIONS 返回 option value 的结构数组字符串 更多信息在这里 表选项例如 我创建表 CREATE
  • 如何告诉 Google 翻译不要翻译网站的某个部分?

    谷歌翻译有一个开发者工具这将在网站上启用谷歌翻译 有没有办法告诉谷歌翻译不要翻译网站的某个部分 也许在 HTML 元素上有一个类名 我已经尝试过HTML5 翻译 否属性 它没有任何作用 这是一个特殊的问题 因为谷歌错误翻译了网站的名称 根据
  • Asp.Net C# MVC 动态表单(更改 Dom 结构并获取服务器上的数据)

    我使用 JavaScript 动态更改客户端的 DOM 以添加一些新的输入字段 不使用Ajax可以在服务器端获取数据吗 只需按下发送按钮即可在我的控制器中获取新数据 答案就在这里 http habrahabr ru blogs aspnet
  • Spring Data Rest 中嵌套资源的分页

    当访问以下 URL 时 我会收到分页响应 api userPosts links self href api userPosts page size sort templated true next href api userPosts p