使用Hibernate SINGLE_TABLE策略从同一Spring JPA存储库阅读不同的实体

mo49yndu  于 2023-01-21  发布在  Spring
关注(0)|答案(1)|浏览(178)

我在同一个表中使用了基本抽象类和2个实体,在Hibernate中使用了描述符类型继承。

@MappedSuperclass()
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type", discriminatorType = DiscriminatorType.INTEGER)
public abstract class Relation {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(columnDefinition = "bigint unsigned", name = "id")
    public long id;
    @Enumerated(EnumType.ORDINAL)
    RelationType type;
}

@Table(name = "relation")
@Entity
@DiscriminatorValue("0")
public class Ban extends Relation {
    // ...
    public RelationType type = RelationType.BAN;
}

与第二个实体相同,但带有@DiscriminatorValue("1")。
问题是:当通过单个存储库读取这些实体时,SQL在"where"条件中不包含鉴别器值。
必须为每个实体提供单独的存储库吗?

k5ifujac

k5ifujac1#

并非必须为每个实体使用单独的资料档案库,但根据您希望检索数据的方式,您可能需要这样做。如果只希望检索特定子类的行,则需要在SQL查询的'where'条件中包括鉴别符列。实现此目的的一种方法是为每个子类创建单独的资料档案库。每一个都具有它们自己的查询方法,这些方法在“where”条件中包括适当的鉴别符值。
或者,您可以使用Hibernate的criteria API或query by example(QBE)来根据鉴别器值过滤结果,这样您就可以对所有实体使用单个存储库,并根据鉴别器值过滤它们。

相关问题