多对多条件无法获取所有正确的数据

Condition on many-to-many does not fetch all right data

我对多对多条件有疑问。 我有这样的数据:

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

我正在尝试从这样的附件 ID 中查找待办事项:

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 中的附件。 如果我删除条件,我就可以检索所有附件。

如何检索所有附件?

谢谢。

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

@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<>();
     
}

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

您必须使用已存在的子查询:

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