Java 多重联接返回精确匹配(如果有)

Java 多重联接返回精确匹配(如果有),java,sql,Java,Sql,我在下面有3张表(简化) 我在Java中有一个ArrayList,其中有一个我给这个方法的用户列表: public Conversation search(ArrayList<User> listUser) throws SQLException, Exception { // build statement Statement st = DataBase.getInstance().createStatement(); Conversati

我在下面有3张表(简化)

我在Java中有一个
ArrayList
,其中有一个我给这个方法的用户列表:

    public Conversation search(ArrayList<User> listUser) throws SQLException, Exception {

// build statement
        Statement st = DataBase.getInstance().createStatement();
        Conversation conversation = null;
        // build and execute query
        ResultSet rs;
        // loop throw the users
        for (User user : listUser) {
            rs = st.executeQuery("SELECT conversation FROM conversation_user WHERE user = " + user.getId());
            // loop throw conversations
            while (rs.next()) {
                int conversationId = rs.getInt("conversation");
                // loop on all user of this conversation
                ResultSet rs2 = st.executeQuery("SELECT user FROM conversation_user WHERE conversation = " + rs.getInt("conversation"));
                // loop on the user list
                boolean matchUser = true;
                int i = 0;
                while (rs2.next()) {
                    // check if there is a match
                    boolean isFound = false;
                    for (User u2 : listUser) {
                        if (rs2.getInt("user") == u2.getId()) {
                            isFound = true;
                            break;
                        }
                    }
                    if (!isFound) {
                        matchUser = false;
                        break;
                    }
                    i++;
                }
                if (!matchUser || listUser.size() != i) {
                    break;
                }
                return new Conversation(conversationId);
            }
        }
        return conversation;

    }  
公共会话搜索(ArrayList listUser)抛出SQLException,Exception{
//构建语句
语句st=DataBase.getInstance().createStatement();
对话=null;
//生成并执行查询
结果集rs;
//循环抛出用户
for(用户:listUser){
rs=st.executeQuery(“从对话中选择对话”\u user WHERE user=“+user.getId());
//循环抛出对话
while(rs.next()){
int conversationId=rs.getInt(“对话”);
//循环此对话的所有用户
ResultSet rs2=st.executeQuery(“从对话中选择用户”\u user WHERE conversation=“+rs.getInt(“对话”));
//用户列表上的循环
布尔匹配用户=true;
int i=0;
while(rs2.next()){
//检查是否有匹配项
布尔值isFound=false;
for(用户u2:listUser){
if(rs2.getInt(“用户”)==u2.getId()){
isFound=true;
打破
}
}
如果(!isFound){
matchUser=false;
打破
}
i++;
}
如果(!matchUser | | listUser.size()!=i){
打破
}
返回新对话(conversationId);
}
}
回话;
}  
如果给定的用户列表和会话中的用户列表之间存在匹配,我希望此方法返回具有正确id的会话。 这应该是一个精确匹配(user give列表中的用户数应该与对话中的用户数匹配)

如果没有完全匹配,则应将null作为对话返回

我希望这是最快的方式尽可能(最少的查询数)

到目前为止,我尝试的是循环到每个用户(列表中)的每个会话,并且每次检查用户和会话是否完全匹配,如果没有完全匹配,则尝试下一个会话(循环中)直到我找到一个我返回的。在listUser的迭代结束时,如果我没有找到任何,我将返回null。 但这真的很慢。。。
我想知道是否可以用较少的查询来完成这项工作。

//在这里编写代码
这些是给您的说明,而不是给我们的。您尝试了什么?我尝试了一些东西,但有很多查询,但效果不太好,我不是真的在寻找代码,而是更多关于如何继续的想法;)我可以处理我尝试循环到每个用户的每个会话的代码,并且每次检查用户和会话是否完全匹配,如果没有完全匹配,我将尝试下一个会话(循环中)在我找到一个返回值之前,如果不是,我将在end处返回null,那么您不会显示用于执行查询的java代码。您正在使用JDBC吗?请出示所有相关代码。这是什么数据库平台?您可以在ArrayList中期望的最大元素数是多少?更新了,是的,我使用JDBC
    public Conversation search(ArrayList<User> listUser) throws SQLException, Exception {

// build statement
        Statement st = DataBase.getInstance().createStatement();
        Conversation conversation = null;
        // build and execute query
        ResultSet rs;
        // loop throw the users
        for (User user : listUser) {
            rs = st.executeQuery("SELECT conversation FROM conversation_user WHERE user = " + user.getId());
            // loop throw conversations
            while (rs.next()) {
                int conversationId = rs.getInt("conversation");
                // loop on all user of this conversation
                ResultSet rs2 = st.executeQuery("SELECT user FROM conversation_user WHERE conversation = " + rs.getInt("conversation"));
                // loop on the user list
                boolean matchUser = true;
                int i = 0;
                while (rs2.next()) {
                    // check if there is a match
                    boolean isFound = false;
                    for (User u2 : listUser) {
                        if (rs2.getInt("user") == u2.getId()) {
                            isFound = true;
                            break;
                        }
                    }
                    if (!isFound) {
                        matchUser = false;
                        break;
                    }
                    i++;
                }
                if (!matchUser || listUser.size() != i) {
                    break;
                }
                return new Conversation(conversationId);
            }
        }
        return conversation;

    }