使用@Orderby by Inherited字段在Hibernate上映射的SortedSet

时间:2017-02-07 21:36:08

标签: java hibernate jpa

我有实体Alpha,并且在其中:

@OneToMany(mappedBy = "alpha")
@OrderBy("attributeName ASC")
@Sort(type = SortType.NATURAL)
private SortedSet<Beta> sortedSet = new TreeSet<Beta>();

实体Beta继承自实体Gamma。 Gamma将“attributeName”作为属性。

如果我使用Beta的属性,可以正常工作。但是当我使用继承属性时,hibernate会尝试在Beta类中查找attributeName属性,实际上该属性不存在。

遵循例外:

could not initialize a collection: [...sortedSet]
...
Caused by: org.hibernate.exception.SQLGrammarException: could not initialize a collection: [...sortedSet]
...
Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "GAMA"."GAMA_NM_ATT": invalid identifier

EDIT1: Alpha,Beta和Gama是我数据库中的表格。

我不能在Gama中使用@MappedSuperClass,因为它是一个表。

简要的实体声明:

@Entity
@Table(name = "GAMA")
@SequenceGenerator(name = "SQ_GAM_CD_GAMA", sequenceName = "SQ_GAM_CD_GAMA")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Gama implements IEntity<Long> {

    @Column(name = "GAM_NM_ATT", nullable = false, length = 260)
    public String getAttributeName() {
        return this.attributeName;
    }
...
}
@Entity
@Table(name = "BETA")
public class Beta extends Gama implements Comparable<Beta> {
    @ManyToOne
    @JoinColumn(name = "BET_CD_BETA", nullable = false)
    public Alpha getAlpha() {
        return alpha;
    }
...
}

@Entity
@Table(name = "ALPHA")
@SequenceGenerator(name = "SQ_ALP_CD_ALPHA", sequenceName = "SQ_ALP_CD_ALPHA")
public class Alpha implements IEntity<Long> {
    @OneToMany(mappedBy = "alpha")
    @Sort(type = SortType.NATURAL)
    @Orderby("attributeName ASC")   //<------------ **PROBLEM**
    private SortedSet<Beta> betaSortedSet = new TreeSet<Beta>();

1 个答案:

答案 0 :(得分:0)

好问题。

我认为您可以尝试使用@Formula

例如:

Beta中添加一个使用@Formula("GAM_NM_ATT")注释的新属性,并在@Orderby上使用此属性。 在这种情况下,它的作用是因为列不明确。

干杯。