【问题标题】:Spring Data JPA find by nested object id (nested twice)Spring Data JPA 通过嵌套对象 id 查找(嵌套两次)
【发布时间】:2019-06-02 18:54:38
【问题描述】:

有可能吗?

我想使用 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 对象。我在我的存储库中尝试了以下方法,但得到 0 个结果。

更新

我的仓库:

@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);
}

【问题讨论】:

  • 取消注释您的查询,并为您的方法选择一个可读的名称。这应该足够了(假设 ViolationCriterion 和 AAA 是同一件事)。我会使用内连接而不是左连接。
  • 是的,我将我的 Repo 更改为 AAA... 给我一点时间
  • 不幸的错误:原因:org.hibernate.QueryException:节点没有数据类型:org.hibernate.hql.internal.ast.tree.IdentNode \-[IDENT] IdentNode: 'cv' { originalText=cv}
  • 您使用的是select cv,然后是from ViolationCriterion vc。始终如一。要么是vc,要么是cv。
  • 这只是意味着您的数据库中不存在符合您条件的行。

标签: spring hibernate jpa spring-data-jpa


【解决方案1】:

在 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 ")
  • 您可以在查询字符串的末尾进行分组。有关示例,请参见 spring jpa 参考
  • 是的,我也没有.. 对不起。我想我把它和order by混淆了。但是,您可以在内存中进行分组。无论如何,我建议将返回值更改为流。比(或在流式传输列表之后)您可以使用 java 流groupingBy。请注意,您必须手动关闭流,或者最好在 try with 块中使用它。
【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2019-08-29
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多