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

Spring数据Rest中嵌套资源的分页

公西浩
2023-03-14

当访问下面的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都是带有分页的JPA存储库。结果,第二个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进行分页?

共有1个答案

伯茂才
2023-03-14

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

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

Spring REST中的/api/users/4/userPosts请求基本上是这样做的:

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

所以检索用户。userPosts是对嵌套实体的即时或惰性引用,并且没有办法对其进行分页。

实现这一目标的最简单也是唯一的解决方案是:1。创建Spring数据搜索查询:UserPostRepository。findByUserId(长id,分页pa)2。创建用于映射的自定义Spring MVC控制

   @Get("/api/users/{id}/userPosts")
   public Page<UserPost> getUserPostsByUserId(Long id, Pagination pagi) {
     return userPostRepository.findByUserId(id, pagi);
 类似资料:
  • 假设我有两种资源:手推车和物品。项目可以嵌套在购物车内,也可以不嵌套在购物车内: 在REST约定中,购物车中的同一项目和购物车中的同一项目是不同的资源吗?

  • 我想像下面这样嵌套资源。 但我不能得到请求。团队中的params[“dashboard_id”]参数,因为它似乎已被参数值替换。我试图通过调用一个中间函数来传递问题,并将参数传递到某个地方,但我不知道在哪里…你有答案吗?谢谢,佛朗哥

  • 我正在努力理解如何在REST中处理嵌套资源。 例如,如果我有一个名为cities的表,另一个名为companies的表具有外键约束(某个城市中存在一家公司),那么当有人获得一个城市时,我是否也应该发送该城市中所有公司的列表?如果是这样,如果他们在特定城市(城市/55)上放置,并且存在嵌套的公司集合,我是否也会更新嵌套的公司? 或者删除怎么样?我是逐级删除一个城市中的所有公司,还是只是暂时将他们所在

  • 以公司的rest表示为例。在这个假设的例子中,每个公司拥有0个或更多的部门,每个部门拥有0个或更多的员工。 一个部门不能没有关联公司。 没有关联部门,员工就无法存在。 null 但是,如果我想列出()所有公司的所有员工,我的困难就来了。 其资源模式将最紧密地映射到(所有员工的集合) 这是否意味着我应该有,因为如果有的话,那么有两个URI可以获得相同的资源? 在基本级别上,返回与嵌套最深的模式完全相

  • 我有一个使用Spring Boot 1.5.1和Spring Data Rest的数据库服务。我将我的实体存储在MySQL数据库中,并使用Spring的PagingAndSorting Repository通过REST访问它们。我发现这表明支持按嵌套参数排序,但我找不到按嵌套字段排序的方法。 我有以下课程: 例如,当使用该方法时: 并调用 URI http://localhost:8080/peo

  • 我正在开发一个Rest Spring Boot应用程序,我的代码如下: > @SpringBootApplication public class Initializer extends SpringBootServletInitializer{ 我想知道我应该在哪里抛出这个异常,是否必须使用类似之类的东西,如果是,如何使用它,需要什么配置?