介绍
我使用springjpa和使用hibernate的jparepository进行了以下设置。这种关系是一刀切的。
主要实体
@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
}
问题
如何使用方法查询来查找具有特定字段的实体或具有特定子类的实体?例如,attra=1的作业。通常在没有继承的情况下,我只会在jparepository repo中定义一个方法,比如 Job findByDetailAttrA(int attrA)
它会起作用的。但是,由于某些原因,对于继承来说,这并不能真正起作用。我得到一个 PropertyReferenceException
消息“找不到类型详细信息的属性属性属性”!遍历路径:job.detail
我提出的临时解决方案是加载特定的detail示例,然后从那里访问作业。然而,在我看来,这并不是一个干净的解决方案,只是因为我希望detailid与jobid相同。
暂无答案!
目前还没有任何答案,快来回答吧!