java - Hibernate内部连接非主键

标签 java hibernate jpa join primary-key

是否有任何方法可以在未标记为 @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/

相关文章:

java - Java 中字符串修剪和分割的高效使用

java - @ManyToOne 引用的 getId() 上的 LazyInitializationException

hibernate - Spring Boot : Apache derby pool empty. 无法在 30 秒内获取连接

java - JPA查询具有多对多关系的多个表

java - 双向映射情况下如何在 spring-data-jpa 中删除

java - 通过 Eclipse 以管理员身份运行 ant

java - 如何在java 8中按列表对象的多个参数进行分组并删除重复的行?

java - 是否可以使 System.out.print 以相反的顺序对变量进行排序?

java - org.hibernate.MappingException : Could not determine type for: (foo)

hibernate - 如何使用 JPA 2's @Cacheable instead of Hibernate' s @Cache