当前位置: 首页 > 面试题库 >

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

龙毅
2023-03-14
问题内容

考虑以下层次结构,其中包含实体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;
    ...

@Entity
public class WidgetA extends Widget implements Serializable  {
...

@Entity
public class WidgetB extends Widget implements Serializable  {
...

我需要通过搜索Widget
serialNumber,但我不知道我在运行时要搜索的Widget的具体类型。什么是正确的搜索窗口小部件的方式,serialNumber例如,如果serialNumber是的WidgetA,则WidgetA返回的实例,依此类推?

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

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

public interface WidgetDAO extends JpaRepository<Widget, Long> {
    public Widget findBySerialNumber(String serialNumber);
}

问题答案:

似乎您没有为窗口小部件层次结构明确指定区分符。我认为您可以尝试明确定义它,因为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;
    ...

--

@Entity
@DiscriminatorValue("A")
public class WidgetA extends Widget implements Serializable  {
...

--

@Entity
@DiscriminatorValue("B")
public class WidgetB extends Widget implements Serializable  {
...


 类似资料:
  • 问题内容: 使用以下代码,我可以成功检索用户的地址字段,为此,我需要使用Projection定义其所有字段。想象地址有100个字段,在这种情况下,我必须定义所有字段。 我想知道是否可以仅返回客户的地址对象而不在Proposition中定义其所有字段吗? 我知道我可以检索地址的ID并使用它来检索其对象,但是我想知道是否还有其他方法而不是此方法或定义其所有字段。 hibernate 我也使用了以下内容

  • 我知道抽象类可能包含抽象和具体方法(即主体实现)。我的问题是:子类可以从抽象超类继承/覆盖具体方法吗?其次,它们必须以实现抽象方法的方式实现具体方法吗?

  • 问题内容: 我有(简化示例): 和一个具体的(简化示例): 现在我需要包括列的索引,和。 如果我添加到hibernate中,则会向继承自的每个Entity 添加一个索引。 我试过了,但是它不能用于索引。 有任何想法吗? 问题答案: 如果正在使用,则可以将类注释及其属性索引一起使用 请注意,如文档所述 仅当表生成有效时才使用它们。默认为无其他索引。 ,如上所示,接受列名列表作为逗号分隔的列表。 如果

  • 接口具有抽象方法和非抽象方法。我想使用super并在具体类中重写。我的问题是为什么我必须这样调用Calculator.super.ramdom()?为什么不工作?

  • 下面是解释我的情况的基本框架代码。 这是超级抽象类: 这是超级抽象类的一个子类:(注意,我删除了其他函数,比如构造函数和方法,以缩短文章的篇幅 我想在抽象类中使用这种公共无效支付(int金额)方法;然而,超级抽象类Person不会接受支付(付款),因为该方法不在范围内。如何使这个工作? 谢谢~