mysql - Hibernate 多对多选择

标签 mysql hibernate jpa spring-data-jpa

上下文:我有两个表 Secret_AgentSecret_Mission 。两者之间存在 @ManyToMany 关系,因为可以指定多个特工来执行相同的 secret 任务,并且可以指定同一个特工执行多个 secret 任务。

表 SECRET_AGENT

<表类=“s-表”> <标题> SecretAgentId SecrentAgentName

表 SECRET_MISSION

<表类=“s-表”> <标题> SecretMissionId secret 任务名称 secret 任务状态

加入表SECRET_AGENT_MISSION

<表类=“s-表”> <标题> SecretAgentId SecretMissionId

Java 代码:

class Secret_Agent { 
. . .

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name ="SECRET_AGENT_MISSION", joinColumns = { @JoinColumn(name =
   "SecretAgentId") }, inverseJoinColumns = { 
@JoinColumn(name = "SecretMissionId") } 
private List <Secret_Mission> missions; 
. . . 
}

class Secret_Mission { 
. . .

@ManyToMany(mappedBy = "missions") 
private List <Secret_Agent> agents;
. . . 
}

问题:我正在尝试让所有特工和特工任务的状态 = 事件。但下面的查询只检索到具有状态为“事件”的任务的特工。

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

任务状态可以是存档或事件。 我只需要任务状态为“事件”的所有 secret 特工,或者只需要任务为空的 secret 特工实体。

最佳答案

可以通过使用 @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/

关于mysql - Hibernate 多对多选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55734679/

相关文章:

java - Hibernate 继承 - 没有用 Id 注释的字段

java - 在JPA中使用Native SQL描述表结构

java - Hibernate 如何处理 NativeSQL 调用的缓存?

mysql - 按国家代码对用户排序

php - 循环遍历字符串中的主题标签并插入到数据库

mysql - 需要帮助在 mySQL 中返回唯一结果

hibernate - 使用@ManyToMany 注释从连接表中级联删除

android - 从sql表中查看图像

hibernate - 如何批量删除 Grails/GORM 中的记录?

jpa - 如何在 JPA CriteriaQuery select 子句中选择 0