2012-03-25 97 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