gpt4 book ai didi

java - Spring Data Rest 中嵌套资源的分页

转载 作者:太空宇宙 更新时间:2023-11-04 14:28:03 25 4
gpt4 key购买 nike

当访问以下 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/userPosts 请求基本上是这样的:

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

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

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

   @Get("/api/users/{id}/userPosts")
public Page<UserPost> getUserPostsByUserId(Long id, Pagination pagi) {
return userPostRepository.findByUserId(id, pagi);
  • 重要!你不能!将 user.userPosts 注释为嵌套在 User 实体中,否则请求映射将会发生冲突。
  • 如果您想要用户实体 JSON 中此路径的导航超链接,那么您需要用户实体 JSON 创建的自定义处理。它的文档很少,并且没有一个示例涵盖您需要稍微探索一下的确切用例。
  • 关于java - Spring Data Rest 中嵌套资源的分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26451920/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com