JPA属性表达式-匹配OneToManyRelationship中的所有子级

要求

我在两个实体之间有一个简单的一对多关系。我想使用JPA属性表达式来查找具有与所有子实体匹配的条件的父实体。

父母

@Entity
public class PcSigningStatus {
    @OneToMany(cascade = CascadeType.ALL,mappedBy = "signingStatus")
    private List<PcSigningProcessEvent> signingProcessEvents = new ArrayList<>();

孩子

@Entity
public class PcSigningProcessEvent {
    @Enumerated(EnumType.STRING)
    private ProcessEventType phase;

    @ManyToOne
    @JoinColumn(name = "SIGNING_STATUS_ID")
    private PcSigningStatus signingStatus;
}

父存储库

public interface SigningStatusRepo extends CrudRepository<PcSigningStatus,Long> {
    PcSigningStatus[] findBySigningProcessEvents_PhaseNot(ProcessEventType phase);
}

问题

假设我在数据库中只有1个父实体,而2个子实体包含不同的 phase 值。上面的查询多次返回同一父对象,具体取决于它与 phase 的值不匹配的子代数。我需要帮助,以找到仅当阶段并非在所有子实体中都存在

skcheung 回答:JPA属性表达式-匹配OneToManyRelationship中的所有子级

也许您应该为此使用@Query?

,

很难理解您的问题:)但是您可以尝试使用https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation

中提到的Distinct添加不同的标志

已修改:或者您可以使用

之类的查询
SELECT * FROM PcSigningProcessEvent WHERE PcSigningProcessEvent.id NOT IN (SELECT SIGNING_STATUS_ID FROM PcSigningProcessEvent WHERE phase = ?)
,

因此,我发现无法使用属性表达式来执行此操作,而不得不使用本机查询。

选择

    @Query(value = "SELECT ss.* FROM PARENT_TABLE ss\n" +
            "left join CHILD_TABLE spe\n" +
            "ON ss.ID= spe.SIGNING_STATUS_ID\n" +
            "and spe.phase IN ('Value1','Value2')\n" +
            "where spe.ID is null",nativeQuery = true)
    PARENT_ENTITY[] customQuery();

这将返回其子级属性 phase 没有值'Value1'或'Value2'或两者都不是的所有父实体。

本文链接:https://www.f2er.com/3160651.html

大家都在问