我有一个通用的数据库结构,可以存储多个用户定义的记录。例如,主表是RECORD,列是STRING01,STRING02,[...],NUM01,NUM02等。
我知道这有点奇怪,但它既有优点也有缺点。但是,这种结构存在且无法改变。现在我想创建一些JPA类。
首先,我创建了一个抽象类RECORD,如下所示(注释放在getters上,这个例子只是简化了):
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE", discriminatorType=DiscriminatorType.STRING)
public abstract class Record {
@Id
private long id;
@Column(name="STRING01")
private String string01;
@Column(name="STRING02")
private String string02;
@Column(name="NUM01")
private BigDecimal num01;
}
然后,我创建了从RECORD继承的特定类:
@Entity
@DiscriminatorValue("Person")
public class Person extends Record {
@Transient
public String getFirstName() {
return getString01();
}
public void setFirstName(String name) {
setString01(name);
}
@Transient
public BigDecimal getWeight() {
return getNum01();
}
public void setWeight(BigDecimal weight) {
setNum01(weight);
}
}
这样可以正常工作,因为我可以查询RECORD以获取PERSON的主键(通过EntityManager.find()
)并获得结果作为PERSON的实例。我可以查询FirstName和Weight,而不必知道通用列名。
但是,如果我像SELECT p FROM Person p WHERE p.firstName = 'Michael'
那样编写自己的JPA查询,则会失败。 firstName
是暂时的,在这里我必须使用通用名称string01
。
在JPA中是否有某种方法可以覆盖基类的属性名称?也许有供应商特定的解决方案(我正在使用EclipseLink)?
答案 0 :(得分:0)
您可以尝试将多个属性映射到同一列。
然后,使用@Column( name = "column name", insertable = false, updatable = false, nullable = false )
注释附加属性。
或者,您可以替换/增强JPQL解析程序,以便在内部将p.firstName
映射到p.string01
,但这将是EclipseLink特定的,我真的不知道这是否均匀可能。把它作为一个暗示要寻找的东西。