[英]Hibernate: how to set relationship among three entity classes, their join table and save in database
[英]JPQL Left Join - how to set up entity relationship in entity classes
兩張桌子:
TABLE_1:
REC_ID
1
2
3
4
TABLE_2:
REC_ID REC_VAL
2 A
3 B
實體類(基本結構):
@Entity
@Table(name="TABLE_1")
public class Entity1 {
@Id
@Column(name="REC_ID")
private String recId;
//getters and setters
}
@Entity
@Table(name="TABLE_2")
public class Entity2 {
@Id
@Column(name="REC_ID")
private String recId;
@Column(name="REC_VAL")
private String recVal;
//getters and setters
}
SQL查詢和結果:
SELECT T1.REC_ID, T2.REC_VAL FROM TABLE_1 T1 LEFT OUTER JOIN TABLE_2 T2 ON T1.REC_ID = T2.RED_ID
Result:
REC_ID REC_VAL
1 null
2 A
3 B
4 null
JPQL查詢:
SELECT e1.recId, e2.recVal FROM Entity1 e1 LEFT JOIN e1.<an Entity2 field in Entity1*>
*我知道我在上面給定的結構中沒有它,但我想知道如何正確地做到這一點。 我如何選擇@ManyToOne,@ OneToOne等。
如何修改Entity類和JPQL查詢以獲得與SQL查詢相同的結果? 我一直在嘗試各種各樣的事情,沒有任何作用。 它不允許我創建具有相同列名的兩個字段,或者將String定義為@JoinColumn。 我幾乎讓它工作,但生成的SQL查詢包含對TABLE_2中REC_ID_REC_ID列的引用,該列不存在。 在Googling這么多之后,我找不到合適的指南( 忽略JPQL不支持內聯連接條件! )
您需要在實體之間建立OneToOne關聯。 而且,在擁有方面,關聯必須使用@MapsId
進行注釋。 以下是從Hibernate文檔中獲取的示例,該文檔映射到您的用例:
@Entity
public class Body {
@Id
public Long getId() { return id; }
@OneToOne(cascade = CascadeType.ALL)
@MapsId
public Heart getHeart() {
return heart;
}
...
}
@Entity
public class Heart {
@Id
public Long getId() { ...}
}
完成后,您可以使用諸如的查詢
select b.foo, h.bar from Body b left join b.heart h where ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.