Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何找到该列表包含另一个列表中的所有元素?_Java_Spring_Hibernate_Spring Boot - Fatal编程技术网

Java 如何找到该列表包含另一个列表中的所有元素?

Java 如何找到该列表包含另一个列表中的所有元素?,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

在我的SpringBoot项目中,我定义了一个由多对多关联的聊天和用户实体

Chat.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
@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
将无法工作。