对于多对一,一对多甚至多对多的关系,如何在没有对象包含的情况下获取对象?
说一组地址和一群人,这种关系会是多对多的,如果我只想找一个没有相关地址的“人”怎么办?
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对象。
我希望得到的只是一个JSON,包括 people.id 和 people.name ,但我得到的是一个JSON,包括一个人以及Set中的所有教室,其中包括所有相关的人。
所以我猜问题是List和List,我应该做的是创建三个表:classroom,people和classroom_people,然后手动存储关系到连接表。然后我可以毫无问题地获取一个简单的对象。
AM我是对的?
我使用Spring Repository和findAllByName(),因此SQL是由spring生成的。只是想知道这是否会成为问题的根源。
答案 0 :(得分:0)
如果保持双向关系,可以使用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()
(如果你打开会话,它会用另一个查询加载空列表)
您不需要自己创建联结表,而不是为此目的。
您如何知道在获取List<ClassRoom>
时填充了People
?因为从您的映射看起来没问题,除非您正在调用people.getClassRooms()