java—多对多的条件不能获取所有正确的数据

eni9jsuy  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(410)

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

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有多个附件,我无法检索结果todo中不在AttachmentId中的附件。如果我删除条件,我可以检索所有附件。
如何检索所有附件?
谢谢。

cotxawn7

cotxawn71#

必须使用exists子查询:

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);
}
kkbh8khc

kkbh8khc2#

如果您有一个联接表,那么可以使用一个联接表。如果我敢打赌这是一个可能的解决办法。应该用数据库列、表和其他变量替换这些名称。

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

}

进一步阅读多对多连接简介。

相关问题