gpt4 book ai didi

java - Hibernate:从单个表中获取所有记录,无论使用 @DiscriminatorValue 定义的类型如何

转载 作者:行者123 更新时间:2023-12-01 16:26:03 24 4
gpt4 key购买 nike

Hibernate 有强大的机制可以使多个实体共享数据库中的同一个表。对我来说,能够获取所有记录(无论子类型如何)将是最重要的。然而这似乎不起作用。

假设我们有一些标准设置:

@Entity
@Table(name = "plane")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name="planetype",
discriminatorType=DiscriminatorType.STRING
)
public abstract class Plane { ... }

@Entity
@Table(name = "plane")
@DiscriminatorValue("A320")
public class A320 extends Plane { ... }

@Entity
@Table(name = "plane")
@DiscriminatorValue("B777")
public class B777 extends Plane { ... }

我需要什么才能访问桌面上的所有飞机?

@Entity
@DiscriminatorValue("")
public class AnyPlane extends Plane { ... } // this doesn't work

@Entity
public class AnyPlane extends Plane { ... } // this doesn't work either

我尝试以通常的方式获取 AnyPlane...

CriteriaBuilder cb = getSession().getCriteriaBuilder();
CriteriaQuery<AnyPlane> q = cb.createQuery(AnyPlane.class);
Root<AnyPlane> root = q.from(AnyPlane.class);

Query<AnyPlane> query = getSession().createQuery(q.select(root)
.where(someRestrictions)
);
return query.list();

...并获取空列表,因为 Hibernate 甚至认为空字符串也是有效的分母。我该怎么办?

值得一提的是,飞机已经愉快地飞上了代码堆栈,我的目标是重构数据库层而不引入太多更改。我也不热衷于使用 native SQL。

最佳答案

我发现的简单解决方案是让 AnyPlane 自行飞行,而不扩展 Plane:

@Entity
@Table(name = "plane")
public class AnyPlane {
... // same fields we would have on the parent

@Enumerated(EnumType.STRING)
@Column(name = "planetype", insertable = false, updatable = false)
private PlaneType planeType;

...
}

public enum LikedEntityType {
A320,
B777
}

还可以考虑为 PlaneAnyPlane 创建一个共同的父级,以避免公共(public)字段的复制粘贴,同时不承担 @DiscriminatorColumn 的罪过>。

关于java - Hibernate:从单个表中获取所有记录,无论使用 @DiscriminatorValue 定义的类型如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62145754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com