java - Hibernate ManyToOne 使用外键连接到非主键目标列

标签 java hibernate jpa orm hibernate-mapping

用户.java

private int userId;
@Column(name="status")
private String userStatus;

@ManyToOne
@JoinFormula(value="SELECT l.lookup_key FROM tb_lookup l WHERE l.category ='XXX'", referencedColumnName="status")
private Lookup statusLookup;

Lookup.java

private int lookupId;
@Column(name="category")
private String lookupCategory;
@Column(name="lookup_key")
private String lookupCode;
private String lookupDescription;

@OneToMany(mappedBy="lookupEntity", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private List<LookupDetail> lookupDetail;

LookupDetail.java

@Id
@Column(name="lookup_detail_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int lookupDetailId;
@Column(name="language_code")
private String languageCode;
@Column(name="lookup_val")
private String lookupValue;

@ManyToOne
@JoinColumn(name="lookup_id", nullable=false)
private Lookup lookupEntity;

所以基本上我需要为 user.java 创建多对一映射注释,这样它就可以提供 sql 查询

select * from User u
inner join Lookup l in u.userStatus = l.lookupCode and l.lookupCategory = 'XXX'

请注意lookup_code不是primary_key(主键是lookup_id) 它是一个遗留数据库,所以我对此无能为力。

谢谢

最佳答案

User 实体可以与非主键列有 @ManyToOne 关联:

@ManyToOne
@JoinColumn(name="userStatus", referencedColumnName="lookupCode")
public Lookup getLookup() { return lookup; }

现在您的查询如下所示:

select u
from User u
inner join u.lookup l
where lookupCategory = :lookupCategory 
<小时/>

如果您想包含该连接的两个条件,则必须使用 @JoinFormula:

@ManyToOne
@JoinFormula(value="SELECT l.lookupCode FROM Lookup l WHERE l.lookupCategory ='XXX'", referencedColumnName="userStatus")
public Lookup getLookup() { return lookup; }

这使用辅助 SELECT,但由于您使用旧架构,因此没有太多其他选项。

关于java - Hibernate ManyToOne 使用外键连接到非主键目标列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28918699/

相关文章:

java - 打破嵌套循环和主循环

java - 设置值链表节点Java

java - 在 Java 程序上保留一个类是一个好方法吗?

java - 需要一个 apache POI createDateConstraint 不使用公式的工作示例

mysql - Hibernate + MySQL 枚举字段错误

java - 不可变值对象和 JPA

mysql - 使用 Spring MVC 连接数据库的最佳方式

java - 由于 hibernate 中的重复实体而引发异常

java - 使用 QueryDSL 按唯一字段查找实体

java - 在部署中找不到名为cinemaReservationPersistenceUnit的持久单元 "javakurs3.final.project.cinema.war"