多对多条件无法获取所有正确的数据
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);
}
我对多对多条件有疑问。 我有这样的数据:
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);
}