两张桌子:
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不支持内联连接条件!)
答案 0 :(得分:2)
您需要在实体之间建立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 ...