2012-03-25 124 views
0

我愿在此基础上表JPA多对一/一对多查询

**category**            

(pk)CategoryID int (10) 
category VARCHAR (45)   

**templatecat** 

(pk/fk)templateId int(10)  
(pk/fk)categoryId int (10) 

**template** 

(pk)templateId int (10) 
template madiumtext 

我也有一个“tempaltecat”表中包含的类别和模板table.I`外键创建JPA查询d喜欢创建基于类别在模板表中查找所有模板的查询,反之亦然。

这里是我的表映射提前

回答

2

它看起来像一个@ManyToMany关系

@Entity 
@Table(name = "category") 
@OneToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "templatecat", joinColumns = { @JoinColumn(name = "categoryId", unique = true) }, inverseJoinColumns = { @JoinColumn(name = "templateId") }) 

private Set<Template> template; 

@Entity 
@Table(name = "template") 
@ManyToOne(optional = true) 
@JoinTable(name = "templatecat", joinColumns = { @JoinColumn(name = "templateId") }, inverseJoinColumns = { @JoinColumn(name = "categoryId") }) 

private Category category; 

感谢,

而不是使用@OneToMany和@ManyToMany的,你可以使用下面的配置:

分类类别:

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "templatecat", joinColumns = { @JoinColumn(name = "categoryId", unique = true) }, inverseJoinColumns = { @JoinColumn(name = "templateId") }) 
private Set<Template> templates; 

模板类:

@Entity 
@Table(name = "template") 
@ManyMany(optional = true, mappedBy="templates"); 
private Set<Category> categories; 

如果你想看到一个给定类别的所有模板,查询将是:

select o.templates from Category o where o.id = ? 

反向从模板工程,以及(所有类别)

select o.categories from Template o where o.id = ? 

希望它对你有帮助。

+0

我认为我的关系是正确的,因为一个类别可以有很多模板,但一个模板不能有多个类别。但是我认为我的问题有点不清楚,我想查找给定类别名称上的所有模板。 – 2012-03-26 07:25:02

+0

所以,为什么不使用'@ OneToMany'(类别中)和'@ ManyToOne'(模板中)关系?通过这种方式,你不需要一个中间表,查询就是:'从类别o中选择o.templates,其中o.name =?' – leozin 2012-03-26 17:04:08