上下文:我有两个表Secret_Agent和Secret_Mission。两者之间都具有@ManyToMany关系,因为可以给许多秘密特工执行相同的秘密任务,并且可以给同一个秘密特工执行许多秘密任务。


  表SECRET_AGENT
  
  列SecretAgentId,SecrentAgentName
  
  表SECRET_MISSION
  
  列SecretMissionId,SecrentMissionName,SecretMissionStatus
  
  联接表
  
  SECRET_AGENT_MISSION
  
  列:SecretAgentId,SecretMissionId


Java代码:


  class Secret_Agent {。 。 。
  
  @ManyToMany(级联= CascadeType.ALL)@JoinTable(名称=
  “ SECRET_AGENT_MISSION”,joinColumns = {@ @JoinColumn(name =
  “ SecretAgentId”)},inverseJoinColumns = {@JoinColumn(name =
  “ SecretMissionId”)}私人名单任务; 。 。 。 }
  
  类Secret_Mission {。 。 。
  
  @ManyToMany(mappedBy =“ missions”)私有列表代理;
  。 。 。 }


问题:我正在尝试获取状态=活跃的所有特工和特工任务。但是下面的查询仅向我查询任务状态为“有效”的特工。

 @Query(FROM FROM Secret_Agent sa "
            + "LEFT JOIN FETCH sa.missions sm"
            + "WHERE sm.status = "ACTIVE" ")


任务状态可以是存档或活动。
我只需要任务状态为ACTIVE的所有秘密特工或任务为空的SecretAgent实体

最佳答案

通过使用@Where批注以以下方式两次映射关联可以解决此问题。

@ManyToMany(mappedBy = "agents")
@Where(clause = "status = 'ACTIVE'")
private List activeMissions

@ManyToMany(mappedBy = "agents")
private List missions


完整的解释可以在这里找到https://thoughts-on-java.org/hibernate-tips-filter-entities-mapped-association/

10-07 17:07