首页 > 解决方案 > 多对多条件不能获取所有正确数据

问题描述

我有一个多对多条件的问题。我有这样的数据:

class Todo {
  ...
  @ManyToMany
  private List<Attachment> attachments;
}

我正在尝试从一些附件 id 中查找 Todo,如下所示:

interface TodoRepository extends JpaRepository<Todo, String> {
  @Query("select t from Todo t left join fetch t.attachments attachment where attachment.id in (:attachmentIds)")
  List<Todo> findAttachedTodos(List<String> attachmentIds);
}

我能够检索相应的待办事项。如果一个 Todo 有多个附件,我无法在结果 Todo 中检索那些不在 attachmentIds 中的附件。如果我删除条件,我可以检索所有附件。

如何检索所有附件?

谢谢。

标签: javahibernatejpamany-to-manyjpql

解决方案


如果你有一个使用连接表的可能性。如果我敢打赌,这可能是一个可能的解决方案。您应该用数据库列表和其他变量替换名称。

@Entity
public class Todo { 
    // ...
 
    @ManyToMany(cascade = { CascadeType.ALL })
    @JoinTable(
        name = "todo_attachment", 
        joinColumns = { @JoinColumn(name = "todo_id") }, 
        inverseJoinColumns = { @JoinColumn(name = "attachment_id") }
    )
    private List<Attachment> attachments;
   
}

您的附件实体应如下所示:

@Entity
public class Attachment {    
    // ...  
 
    @ManyToMany(mappedBy = "attachments")
    private List<Todo> todos = new ArrayList<>();
     
}

进一步阅读关于多对多连接的介绍。


推荐阅读