【问题标题】:Hibernate ManyToMany select休眠多对多选择
【发布时间】:2019-04-17 19:25:31
【问题描述】:

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

表 SECRET_AGENT

列 SecretAgentId、SecrentAgentName

表 SECRET_MISSION

列 SecretMissionId、SecrentMissionName、SecrentMissionStatus

加入表

SECRET_AGENT_MISSION

列:SecretAgentId、SecretMissionId

Java 代码:

类 Secret_Agent { . . .

@ManyToMany(cascade = CascadeType.ALL) @JoinTable(name = "SECRET_AGENT_MISSION", joinColumns = { @JoinColumn(name = "SecretAgentId") }, inverseJoinColumns = { @JoinColumn(name = "SecretMissionId") } 私人列表任务; . . . }

类 Secret_Mission { . . .

@ManyToMany(mappedBy = "missions") 私有列表代理; . . . }

问题:我正在尝试获取状态 = 激活的所有特工和特工任务。但是下面的查询只检索到具有状态为 Active 的任务的特工。

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

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

【问题讨论】:

    标签: mysql hibernate jpa spring-data-jpa


    【解决方案1】:

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

    【讨论】:

    • 如果我将它映射两次并运行这些查询:这将返回 m 所有具有活动状态的代理和任务
    • 或者它应该只返回我有活跃任务的特工
    • 你应该把你的查询改为LEFT JOIN FETCH sa.activeMissions,因为@ManyToMany默认有FetchType.Lazy,所以任务集合不会被初始化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多