我有以下表格:
[table:column1,column2]
A:id,name
B:id,name
AB:idA,idB
AB是一个连接表。
然后我在hibernate类B上有这个方法
@OneToMany( fetch = FetchType.EAGER)
@JoinTable( name = "AB",
joinColumns = @JoinColumn( name = "idB"),
inverseJoinColumns = @JoinColumn( name = "idA") )
public List<A> getAs(){
//return the list of matching stuff
}
这完全没问题。
现在我想在hibernate中执行这个sql查询:
select * from B inner join AB on B.id = AB.idB where AB.idA = 1234
基本上,'列出所有引用A且ID为1234的B'
我可以直接使用sql,但这会破坏getAs()
的目的是否有可能构建一个标准/限制条款来实现这一目标?
答案 0 :(得分:1)
在这种情况下,A
和B
之间的关系不是一对多关系,而是多对多关系。你应该这样映射:
@ManyToMany
@JoinTable(name = "AB",
joinColumns = @JoinColumn( name = "idB"),
inverseJoinColumns = @JoinColumn( name = "idA") )
public List<A> getAs(){
//return the list of matching stuff
}
请注意,在大多数情况下,急切地提取集合并不是一个好主意,因此上面已删除了fetch = FetchType.EAGER
。您现在可以在A
侧执行相同操作以使关系双向:
@ManyToMany(mappedBy='As')
public List<B> getBs(){
//return the list of matching stuff
}
现在获取给定B
的所有A
只需要在getBs()
个实例上调用A
。您也可以创建条件/编写HQL来实现这一点 - 从任何一方开始。