Spring Data JPA通过嵌套对象id(嵌套两次)进行查找

5

这可行吗?

我想使用 JPARepository 获取所有具有特定 CCC.incidentAssessmentResultId ID 的 AAA 对象。这可行吗?

   @Entity
    @Table(schema = "aaa", name = "table")
    public class AAA {

        @Column(name = "kryterium")
        private String criterion;

        @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
        @JoinColumn(name = "id_kryterium_naruszen")
        private List<BBB> violationFactors;

    }

    public class BBB {

        @Column(name = "czynnik")
        private String factor;

        @Column(name = "stopien")
        private float degree;

        @JsonManagedReference
        @OneToOne(mappedBy = "violationFactor")
        private CCC incidentAssessmentFactor;
}

public class CCC {

    @Column(name="komentarz")
    private String comment;

    @Column(name="ocena_naruszenia_wynik_id", updatable=false, insertable=false)
    private Long incidentAssessmentResultId; //-> I'd like to find AAA objects with a specific incidentAssessmentResultId ID

    @Column(name="czynnik_wybrany")
    private Boolean factorIsSelected;

    @Column(name = "wartosc_wybrana")
    private float value;


    @Repository
    public interface ViolationCriterionRepository extends JpaRepository<AAA, Long> {

    //  @Query("select vc from AAA vc left join vc.violationFactors vf left join vf.incidentAssessmentFactor iaf where iaf.incidentAssessmentResultId = ?1")
        List<AAA> findByViolationFactors_IncidentAssessmentFactor_IncidentAssessmentResultId(Long incidentId);
    }

现在,当我调用ViolationCriterionRepository.findAll()时,我会得到所有的数据,但是我想得到所有的数据,但是带有某些CCC对象。我已经在我的存储库中尝试了下面的方法,但我没有得到任何结果。

更新

我的存储库:

@Repository
public interface ViolationCriterionRepository extends JpaRepository<ViolationCriterion, Long> {

    @Query("select vc from AAA vc join vc.violationFactors vf join vf.incidentAssessmentFactor iaf where iaf.incidentAssessmentResultId = ?1")
    List<AAA> findByIncidentAssessmentResultId(Long incidentId);
}

1
取消注释您的查询,并为您的方法选择一个易读的名称。这应该足够了(假设ViolationCriterion和AAA是相同的)。我会使用内连接而不是左连接。 - JB Nizet
是的,我把我的代码库改成了AAA... 给我一点时间。 - Matley
很遗憾,出现了错误:Caused by: org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.IdentNode -[IDENT] IdentNode: 'cv' {originalText=cv} - Matley
你正在使用 select cv,然后是 from ViolationCriterion vc。请保持一致,要么用 vc,要么用 cv。 - JB Nizet
1
这意味着您的数据库中不存在与您的条件匹配的行。 - JB Nizet
显示剩余5条评论
2个回答

6
在AAAJpaRepository中:
List<AAA> aaaList = findByViolationFactorsIncidentAssessmentFactorIncidentAssessmentResultId( long incidentAssessmentResultId);

也可以工作!但在这种情况下如何添加groupBy子句?使用查询,解决方案是@Query("select vc from AAA vc join vc.violationFactors vf join vf.incidentAssessmentFactor iaf join iaf.incidentAssessment ia where ia.incidentAssessmentId = ?1 group by vc ")。 - Matley
您可以在查询字符串的末尾进行分组。请参阅Spring JPA参考文档获取示例。 - PeMa
是的,我也不知道。。。对此感到抱歉。我想我把它和“order by”混淆了。然而,你可以在内存中进行分组。我仍然建议将返回值更改为流。然后(或在流式处理列表之后),你可以使用Java流groupingBy。请注意,你必须手动关闭流,或者最好在try-with块中使用它。 - PeMa

2

答案是(感谢@JB Nizet - 最初的回答):

@Repository
public interface ViolationCriterionRepository extends JpaRepository<ViolationCriterion, Long> {

    @Query("select vc from AAA vc join vc.violationFactors vf join vf.incidentAssessmentFactor iaf join iaf.incidentAssessment ia where ia.incidentAssessmentId = ?1 group by vc ")
    List<ViolationCriterion> findIncidentAssessmentByIncidentAssessmentId(Long incidentId);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接