Java 如何为复合子类实体创建JPA方法查询?

Java 如何为复合子类实体创建JPA方法查询?,java,spring,database,spring-data-jpa,Java,Spring,Database,Spring Data Jpa,导言 我使用SpringJPA和使用Hibernate的JPA存储进行了以下设置。这段关系是一刀切的 主要实体 @Entity @Data @Table public class Job { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) protected Long jobId; @OneToOne(mappedBy = "job", cascade = Cascad

导言

我使用SpringJPA和使用Hibernate的JPA存储进行了以下设置。这段关系是一刀切的

主要实体

@Entity
@Data
@Table
public class Job {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long jobId;
    
    @OneToOne(mappedBy = "job", cascade = CascadeType.ALL)
    protected Detail detail;
    
    public void setDetail(Detail detail)
    {
        detail.setJob(this);
        this.details = detail;
    }
    
    public JobSource getSource()
    {
        return this.getDetails().getSource();
    }
}
细节实体

@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "source", discriminatorType = DiscriminatorType.STRING)
@Entity(name = "jobDetail")
@Table(name = "jobDetail")
@Data
public abstract class Detail 
{
    @Id
    protected Long detailId;
    
    @JoinColumn(name = "jobId")
    @MapsId
    protected Job job;
}

@DiscriminatorValue(value = "A")
@Entity(name = "A")
@Table(name = "A")
public class DetailSourceA 
{
    protected int attrA;
}

@DiscriminatorValue(value = "B")
@Entity(name = "B")
@Table(name = "B")
public class DetailSourceB 
{
    protected int attrB1;
    protected int attrB2;
}
存储库

@Repository
public interface JobDao extends JpaRepository<Job, Long>
{
    Job findByDetailAttrA(int attrA); //Should return a job with detail implementation DetailSourceA
}
@存储库
公共接口JobDao扩展了JpaRepository
{
Job findByDetailAttrA(int attrA);//应返回一个包含详细实现细节的Job DetailSourceA
}
问题

如何使用方法查询找到具有特定子类的特定字段的实体?例如attrA=1的作业。通常在没有继承的情况下,我只需在JpaRepository Repo中定义一个类似于
Job findByDetailAttrA(int attrA)
的方法就可以了。然而,由于某些原因,对于继承来说,这并不真正起作用。我得到一个
PropertyReferenceException
,消息是找不到类型详细信息的属性属性属性!遍历路径:Job.detail

我提出的临时解决方案是加载特定的细节实例,然后从那里访问作业。然而,在我看来,这并不是一个干净的解决方案,只是因为我希望detailId与jobId相同