gpt4 book ai didi

mysql - Spring Hibernate Mysql : how to get object for many-to-one, 多对多、一对多

转载 作者:行者123 更新时间:2023-11-29 21:27:52 27 4
gpt4 key购买 nike

对于多对一、一对多甚至多对多的关系,如何获取一个对象而不包含对方的对象?

假设一组地址和一群人,关系是多对多,如果我只想得到一个没有相关地址的“人”怎么办?

Classroom.java

@Entity
public class Classroom {

public Classroom(){
}

public Classroom(long id, String name) {
this.id = id;
this.name = name;
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;

@Column(name = "name")
private String name;

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "classroom_people",
joinColumns = {@JoinColumn(name = "classroom_id", referencedColumnName = "id") },
inverseJoinColumns = {@JoinColumn(name = "people_id", referencedColumnName = "id") })
private List<People> peoples = new ArrayList<>();

...
// getter() and setter()

}

People.java

@Entity
public class People{

public People(){
}

public People(long id, String name) {
this.id = id;
this.name = name;
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
private long id;

@Column(name = "name")
private String name;

@ManyToMany(mappedBy = "peoples", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Classroom> classrooms = new ArrayList<>();

...
// getter() and setter()

}

通过使用hibernate,已经自动创建了Classroom、People表和连接表classroom_people。到目前为止,一切都很好。

然后,通过使用 spring 存储库,我尝试通过传递名称来获取人员,并返回一个 JSON 对象。

我希望得到的只是一个包含 people.idpeople.name 的 JSON,但我得到的是一个包含一个 people 的 JSON > 以及集合中的所有教室,其中包括所有相关

所以我猜问题是列表和列表,我应该做的是创建三个表:classroom、people 和classroom_people,然后手动存储关系以连接表。然后我就可以毫无问题地获取一个简单的对象。

我说得对吗?

enter image description here

enter image description here

enter image description here

enter image description here

我使用Spring Repository和findAllByName(),所以SQL是由spring生成的。只是想知道这是否是问题的根源。

最佳答案

如果您保持双向关系,则可以使用 HQL 轻松完成。类似于:

String hql = "select addr.people from " + Address.class.getName() + " addr where addr.name(or some other attribute) = :addressName"
//set parameter "addressName"

编辑:现在您采用了不同的示例,但上面的查询适用相同的情况,例如从教室获取人员。

关于你的最后一条笔记,得到 People按名称将仅获取 People例如,因为@ManyToMany List引用教室是 LAZY,这意味着在您调用 people.getClassRooms() 之前不会填充 (如果您打开了 session ,它将使用另一个查询加载空列表)您不需要自己创建联结表,不是为了这个目的。

你怎么知道List<ClassRoom>当您获取 People 时会填充?因为从你的映射来看它看起来没问题,除非你打电话 people.getClassRooms()

关于mysql - Spring Hibernate Mysql : how to get object for many-to-one, 多对多、一对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35426551/

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