[英]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.