Java 通过非主键休眠内部联接

Java 通过非主键休眠内部联接,java,hibernate,jpa,join,primary-key,Java,Hibernate,Jpa,Join,Primary Key,有没有办法在未标记为@Id的字段上的两个表之间创建内部联接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 priva

有没有办法在未标记为@Id的字段上的两个表之间创建内部联接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;
解释:

@ManyTone是用于映射实体之间关系的注释,此注释必须用于生成两个实体之间的链接。如果不创建此链接,您将无法直接从一个查询填充此字段

@JoinColumn是用于映射将用于在实体之间创建链接的列的注释。属性“referencedColumnName”是您必须指定要用作关系的列的位置

完成此任务后,AEntity必须能够在查询中看到BEntity,并且能够直接从AEntity检索BEntity字段

为了满足您的需要,您可以尝试以下查询(请记住,它是用jpql编写的):

从实体a中选择a,其中a.woCode=a.bEntity.refId

通过这种方式,您应该能够通过AEntity访问BEntity的所有字段


请告诉我们这是否解决了您的问题。

我无法删除@Transient。这是有目的的。正是因为你提到的原因。要解决这个问题,你必须定义实体之间的关系。请再次参阅“ManyToOne”和“JoinColumn”部分,并尝试重现给定的步骤。