【问题标题】:SpringBoot REST API many-to-many, I want to fetch all members in TeamSpring Boot REST API 多对多,我想获取团队中的所有成员
【发布时间】:2021-12-30 20:22:49
【问题描述】:

我的“团队”端点工作正常,我正在收到来自其他客户端的响应,但是我无法检索每个团队中的成员。

我的 Json 文件看起来像这样:

{
    "id": 5,
    "teamName": "OUTLIERS",
    "year": 2021,
    "teamLead": {
              "name":"bbb",
               "status":"ABC"
}, "members":[
{},{},{}
]

团队终点:

    @GetMapping(path = **"/{id}/members")**
    public List<Member> getTeamMembers(@PathVariable Long id) {

        //System.out.println(team.getMembers().size());
        List<Member> members = teamRepo.getOne(id).getMembers();
        return members;
    }

// ----- Member Pojos ---

package org.itpn.web.pojos;

import lombok.Data;

@Data
public class MemberVO {

private Long memberId;

String firstName;

String lastName;

String membershipId;

Long primaryPhone;

String whatsappPhone;

String emailAddress;

boolean active;
    
}

在上面的代码根目录是 "/teams" ,我正在尝试从 team/id/members 资源中获取成员。

【问题讨论】:

  • 你能分享一下回购吗?
  • 它看起来像是 Team 实体上 members 字段的延迟初始化,但需要更多上下文。你使用数据库和 Hibernate 吗?
  • @VitalyKolesnikov 是的,获取类型是 = Lazy,我使用的是 Mysql 和 Spring Hibernate。
  • ` @Entity @Data @Table(name = "teams") public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "team_id") private Long id; @Column(name = "team_name") 字符串团队名称; @ManyToMany(cascade = {CascadeType.DETACH,CascadeType.MERGE, CascadeType.REFRESH,CascadeType.PERSIST},fetch = FetchType.LAZY) @JoinTable(name = "member_teams", joinColumns = @JoinColumn(name = "team_id"), inverseJoinColumns = @JoinColumn(name = "member_id")) //@JsonIgnore private List members; } `
  • 在 cmets 部分编写代码不是一个好主意。请将您的项目上传到 Github 并提供链接。这样每个人都可以在 IDE 中看到整个项目并找到问题所在。

标签: java json spring-boot rest maven


【解决方案1】:

好吧,问题太多了。

您上传代码的方式(所有类都在一个文件中)太荒谬了,而且它看起来根本不像 Spring 应用程序。

为什么你的控制器中有存储库依赖而不是服务?

如果您的控制器方法返回成员实体列表,为什么还需要 MemberVO(我想是 DTO?)?

所以无论如何,我创建了一个测试项目并进行了重构并将其上传到 Github。它与成员一起工作并返回团队。您可以下载并更改您需要的任何内容。

https://github.com/VitalyKolesnikov/Teams

【讨论】:

  • 现在我可以访问成员了 - 非常感谢您的帮助,我无法分享完整的项目,因为它是私人项目,我分享了我遇到困难的那些类文件。 MemberVO - 我想以某种方式注入这个类,因为我不想从数据库中的实际成员实体获得完整信息。
  • 您可以将方法“MemberVO fromMember(Member member)”添加到 MemberVO 类,它将实体映射到 DTO。然后在控制器中调用此方法并返回您的 DTO。
【解决方案2】:

尝试获取类型 - 像 fetch = FetchType.EAGER 一样渴望

【讨论】:

【解决方案3】:

根据目前给出的信息,我建议在存储库中使用 HQL 查询创建一个方法 getTeamWithMembers(Long id),如下所示:

select t from Team t left join fetch t.members

【讨论】:

  • 它没有按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2021-10-08
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多