Spring Data JPA(Hibernate):如何仅使用其抽象超类中的字段来检索具体实体?

CFL*_*eff 13 java inheritance hibernate jpa spring-data-jpa

考虑以下层次结构,其中实体WidgetAWidgetB扩展抽象Widget超类:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Widget implements Serializable  {

    @Column(name="serialNumber", length=64, nullable=false, unique=true)
    private String serialNumber;
    ...
Run Code Online (Sandbox Code Playgroud)

@Entity
public class WidgetA extends Widget implements Serializable  {
...
Run Code Online (Sandbox Code Playgroud)

@Entity
public class WidgetB extends Widget implements Serializable  {
...
Run Code Online (Sandbox Code Playgroud)

我需要搜索Widgets serialNumber,但我不知道我在运行时搜索的Widget的具体类型.搜索小部件的正确方法是什么serialNumber,如果serialNumber是a的WidgetA,那么WidgetA返回的实例,依此类推?

我试图findyBySerialNumber()WidgetDAO中使用a ,我收到一个错误,告诉我我无法实例化一个抽象类,这是有道理的,但我认为持久性提供程序会知道如何查看具体的子实体表和返回正确的实例.我可以这样做吗?

我正在使用"Spring Data JPA",因此Widget DAO非常简单:

public interface WidgetDAO extends JpaRepository<Widget, Long> {
    public Widget findBySerialNumber(String serialNumber);
}
Run Code Online (Sandbox Code Playgroud)

ben*_*n75 11

您似乎没有为窗口小部件层次结构明确指定鉴别器.我认为您可以尝试明确定义它,因为Spring Data将操纵字节码来生成查询,因此我怀疑SpringData需要明确定义这些值.

此外,在子类中,您需要指示每个子类的鉴别器值.

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="WIDGET_TYPE")
public abstract class Widget implements Serializable  {

    @Column(name="serialNumber", length=64, nullable=false, unique=true)
    private String serialNumber;
    ...
Run Code Online (Sandbox Code Playgroud)

-

@Entity
@DiscriminatorValue("A")
public class WidgetA extends Widget implements Serializable  {
...
Run Code Online (Sandbox Code Playgroud)

-

@Entity
@DiscriminatorValue("B")
public class WidgetB extends Widget implements Serializable  {
...
Run Code Online (Sandbox Code Playgroud)