是否有任何方法可以在未标记为 @Id 的字段上的 2 个表之间创建内连接 1X1 关系?
表A:
@Entity
public Class AEntity
@Id
private Long id
@Column
private String woCode
@Transient
private BEntity bEntity
表B:
@Entity
public Class BEntity
@Id
private Long id
@Column
private String refId
@Column
private String title
需要做什么才能最终遵循 SQL:
select * from A inner join B on A.woCode=B.refId
在查询 AEntity 时,bEntity 字段将使用表 B 中的相应数据填充。
最佳答案
是的,有一种方法可以做到这一点。
首先,您必须删除 AEntity 类中 bEntity 属性的 @Transient 注释。 @Transient 是一个注释,用于定义您不想保留到数据库中的属性。
如果您在删除 @Transient 注释后尝试部署应用程序,您将收到 Hibernate 映射错误,这是预期的行为,因为属性 bEntity 将不会映射到数据库内。因此,要创建正确的映射,您应该执行以下操作:
@ManyToOne
@JoinColumn(name = "refId", referencedColumnName = "refId")
private BEntity bEntity;
解释:
@ManyToOne 是用于映射实体之间关系的注释,必须使用此注释来生成两个实体之间的链接。如果不创建此链接,您将无法直接从一个查询填充此字段。
@JoinColumn 是用于映射您将使用哪个列来创建实体之间的链接的注释。您必须在属性“referencedColumnName”中指定将用作关系的列。
完成此任务,AEntity 必须能够在查询中看到 BEntity,并且还能够直接从 AEntity 检索 BEntity 字段。
为了满足您的需求,您可以尝试以下查询(记住,它是用 jpql 编写的):
从 AEntity a 中选择 a,其中 a.woCode = a.bEntity.refId
这样您应该能够通过 AEntity 访问 BEntity 的所有字段。
请告诉我们这是否可以解决您的问题。
关于java - Hibernate内部连接非主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32509108/