Java 使用ForeignKey将manytone休眠到非PrimaryKey目标列
User.javaJava 使用ForeignKey将manytone休眠到非PrimaryKey目标列,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,User.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 pr
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;
所以基本上我需要为user.java创建多对一映射注释,这样它就可以提供sql查询
select * from User u
inner join Lookup l in u.userStatus = l.lookupCode and l.lookupCategory = 'XXX'
请注意,查找代码不是主键,主键是查找id
这是一个遗留数据库,所以我对此无能为力
感谢用户实体可以与非主键列建立@manytone关联:
@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:
这使用了一个辅助选择,但由于您使用的是旧模式,因此您没有太多其他选项。谢谢,它可以工作,但缺少了一个额外的子句和l.lookupCategory='XXX'抱歉,但是它可以工作,因为userStatus是用户实体而不是查找实体抱歉,但是它不能工作,因为userStatus是用户实体而不是查找实体确实,我更改了公式查询。现在试试。对不起,它仍然不起作用。错误:在org.hibernate.mapping.Tabletb_lookup及其相关的超级表和辅助表中找不到逻辑名称为userStatus的列,该列仍引用查找表而不是用户表
select u
from User u
inner join u.lookup l
where lookupCategory = :lookupCategory
@ManyToOne
@JoinFormula(value="SELECT l.lookupCode FROM Lookup l WHERE l.lookupCategory ='XXX'", referencedColumnName="userStatus")
public Lookup getLookup() { return lookup; }