Java 如何找到该列表包含另一个列表中的所有元素?
在我的SpringBoot项目中,我定义了一个由多对多关联的聊天和用户实体 Chat.javaJava 如何找到该列表包含另一个列表中的所有元素?,java,spring,hibernate,spring-boot,Java,Spring,Hibernate,Spring Boot,在我的SpringBoot项目中,我定义了一个由多对多关联的聊天和用户实体 Chat.java @ManyToMany @JoinTable(name = "chat_user", joinColumns = @JoinColumn(name = "chat_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnNa
@ManyToMany
@JoinTable(name = "chat_user",
joinColumns = @JoinColumn(name = "chat_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
private Set<User> users = new HashSet<User>();
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
@ManyToMany
@JsonBackReference
@JoinTable(name = "chat_user",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "chat_id", referencedColumnName = "id"))
private Set<Chat> chats = new HashSet<Chat>();
public Set<Chat> getChats() {
return chats;
}
public void setChats(Set<Chat> chats) {
this.chats = chats;
}
@manytomy
@JoinTable(name=“chat\u user”,
joinColumns=@JoinColumn(name=“chat\u id”,referencedColumnName=“id”),
inverseJoinColumns=@JoinColumn(name=“user\u id”,referencedColumnName=“id”))
private Set users=new HashSet();
公共集getUsers(){
返回用户;
}
公共void集合用户(集合用户){
this.users=用户;
}
User.java
@ManyToMany
@JoinTable(name = "chat_user",
joinColumns = @JoinColumn(name = "chat_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
private Set<User> users = new HashSet<User>();
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
@ManyToMany
@JsonBackReference
@JoinTable(name = "chat_user",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "chat_id", referencedColumnName = "id"))
private Set<Chat> chats = new HashSet<Chat>();
public Set<Chat> getChats() {
return chats;
}
public void setChats(Set<Chat> chats) {
this.chats = chats;
}
@manytomy
@JsonBackReference
@JoinTable(name=“chat\u user”,
joinColumns=@JoinColumn(name=“user\u id”,referencedColumnName=“id”),
inverseJoinColumns=@JoinColumn(name=“chat\u id”,referencedColumnName=“id”))
私有集chats=newhashset();
公共集getChats(){
回访聊天;
}
公共无效设置聊天(设置聊天){
this.chats=聊天;
}
如何在crudepository中编写一个方法,以便从用户列表中获取包含所有用户的聊天列表
到目前为止,我有一个书面方法返回一个聊天列表,其中包含用户列表中的任何用户
public interface ChatRepo extends CrudRepository<Chat, Long> {
List<Chat> findAllByUsers(User user);
List<Chat> findDistinctByUsersIn(Set<User> users);
}
ChatRepo公共接口扩展了crudepository{
列出findAllByUsers(用户);
列出findDistinctByUsersIn(设置用户);
}
从我的观点来看,没有直接的解决方案。你能做的是在聊天室中创建一个方法,如下所示
public interface ChatRepository extends CrudRepository<Chat, Long> {
@Query("select c from Chat c WHERE :user in elements(c.users)")
List<Chat> getChatsWithUsers(@Param("user") User user);
}
但我同意这不是一个理想的解决方案,因为如果列表太大,则会导致多个数据库调用
@ManyToMany
@JoinTable(name = "chat_user",
joinColumns = @JoinColumn(name = "chat_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName =
"id"))
private Set<User> users = new HashSet<User>();
I think this is maybe wrong. Because one chat id cannot point out many user.
So you can use simple jointable to user entity
@JoinTable(name=“chat\u user”,
joinColumns=@JoinColumn(name=“chat\u id”,referencedColumnName=“id”),
inverseJoinColumns=@JoinColumn(name=“user\u id”,referencedColumnName=
“身份证”))
private Set users=new HashSet();
我认为这可能是错误的。因为一个聊天id不能指出多个用户。
所以您可以使用简单的连接表来连接用户实体
像Malte Hartwig建议的那样实现equals/hashCode就是解决方案
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof User)) {
return false;
}
User user = (User) o;
return id == user.id &&
Objects.equals(firstName, user.firstName) &&
Objects.equals(lastName, user.lastName) &&
Objects.equals(userName, user.userName) &&
Objects.equals(password, user.password);
}
@Override
public int hashCode() {
return Objects.hash(id, firstName, lastName, userName, password);
}
这里有什么问题?获取所有聊天记录,对其进行迭代,并检查其用户集(不是列表btw)是否包含已传递的用户集。您可以使用的方法之一是
containsAll()
方法。优化的一种方法是在查询中这样做。可能有一些HQL函数(我不记得了),但一个快速查询得出了这样的结论:我只是这样尝试过,但当应用containsAll()方法时,总是返回false作为响应。因此,我想检查是否有一种方法可以通过repository方法获得响应。我的理解是,您有一个用户列表,并且希望将每个用户的所有聊天记录作为一个列表获取?我说的对吗?所有聊天都将收到的用户列表中的所有用户作为一个列表。您的用户类是否正确实现了equals/hashCode
?否则,containsAll
将无法工作。