Java 如何为复合子类实体创建JPA方法查询?
导言 我使用SpringJPA和使用Hibernate的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
@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相同