У меня есть общая структура базы данных, которая может хранить несколько пользовательских записей.Например, основной таблицей является RECORD, а столбцами являются STRING01, STRING02, [...], NUM01, NUM02 и т. Д.
Я знаю, что это немного странно, но у нее есть как преимущества, так и недостатки.Однако эта структура существует и не может быть изменена.Теперь я хочу создать несколько классов JPA.
Сначала я создал абстрактный класс RECORD следующим образом (аннотации помещены в getter, пример просто упрощен):
@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 для первичного ключа ЧЕЛОВЕКА (через EntityManager.find()
) и получить Result в качестве экземпляра PERSON.Я могу запросить FirstName и Weight, не зная общих имен столбцов.
Однако, если я напишу свой собственный JPA-запрос, такой как SELECT p FROM Person p WHERE p.firstName = 'Michael'
, произойдет сбой.firstName
является временным, и здесь я должен использовать общее имя string01
.
Есть ли какой-нибудь способ переопределить имя атрибута базового класса в JPA?Может быть, есть решение для конкретного поставщика (я использую EclipseLink)?