当前位置: 首页 > 知识库问答 >
问题:

Java MySQL结果集算法[重复]

萧星火
2023-03-14

我正在使用以下代码在ArrayList中保存彼此喜欢的匹配人员的id。

我的数据库是finder。喜欢和它的小报:

我的问题是,正如我所说的,我想在ArrayList中保存匹配的人。例如,用户15和17喜欢11,用户11也喜欢15和17,所以当用户11登录到程序中时,我想显示这个用户15和17是您的匹配。我试图设置算法,但我得到了“结果集关闭后不允许操作”。我的错误在哪里?

功能是

public ArrayList<Integer> matchCount() throws SQLException {
    
        ArrayList<Integer> matchers = new ArrayList<Integer>();
        
        Statement st = con.getConnection().createStatement();
        
        ResultSet rs3 = st.executeQuery("select count(*) from finder.liked where user_id="+login.loggedUser.id);
        rs3.next();
        
        ResultSet rs2 = st.executeQuery("select * from finder.liked where user_id="+login.loggedUser.id);
        
        while(rs2.next()) {
            
            ResultSet rs1 = st.executeQuery("select * from finder.liked where liked_id="+login.loggedUser.id);
            rs1.next();
            
            for(int i = 0 ; i < rs3.getInt(1) ; i++) {
                
                if(rs2.getInt(3)==rs1.getInt(2)) {
                    
                    matchers.add(rs1.getInt(2));
                    
                }
                rs1.next();
            }
            
        }       
        return matchers;
    }

共有3个答案

赵元白
2023-03-14

为每个查询创建连接

曹铭晨
2023-03-14

当运行相同语句的查询时,Java关闭任何已经打开的ResultSet对象。

您可以使用不同的语句,它会很好地工作

 Your code :
 ResultSet rs2 = st.executeQuery ... 
 ResultSet rs3 = st.executeQuery ...// rs2 closed here 
 ResultSet rs1 = st.executeQuery ... // rs3 closed here 

 ------------
 Solution 
 Statement st1 = con.getConnection().createStatement();
 Statement st2 = con.getConnection().createStatement();
 Statement st3 = con.getConnection().createStatement();

 ResultSet rs1 = st1.executeQuery ... 
 ResultSet rs2 = st2.executeQuery ...
 ResultSet rs3 = st3.executeQuery ... 

文档:https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html

语句接口中的所有执行方法都隐式关闭状态的当前ResultSet对象(如果存在打开的对象)。

曾鸿振
2023-03-14

首先,您应该使用预准备语句来避免SQL注入。你可以使用组Conconat来获取喜欢一个用户的所有用户的列表,并在同一个查询中对他们进行计数:

select count(*), group_concat(liked_id) 
from finder.liked 
where user_id=?
group by user_id

有了这个查询,你只得到一行看起来user_id喜欢的计数和用户列表由分隔

 类似资料:
  • 以下网站展示了如何在JDBC中使用新的“自动关闭”功能:link。该网站显示了语句将如何自动关闭,但结果集不在try()部分,在那里它将自动关闭。所以,我的问题是,我不需要在Java 7中直接关闭结果集吗?我一直使用这种模式:关闭结果集、关闭语句、关闭连接。

  • 主要内容:ResultSet类型,ResultSet的并发性,浏览结果集,查看结果集,更新结果集SQL语句执行后从数据库查询读取数据,返回的数据放在结果集中。 语句用于从数据库中选择行并在结果集中查看它们的标准方法。 接口表示数据库查询的结果集。 对象维护指向结果集中当前行的游标。 术语“结果集”是指包含在对象中的行和列数据。 接口的方法可以分为三类: 浏览方法:用于移动光标。 获取方法:用于查看光标指向的当前行的列中的数据。 更新方法:用于更新当前行的列中的数据。 然后在基础数据库中更新数

  • 我有以下问题: 我有一个如下的方法,一次只能收集500个名字: 我有一个1000个名字的列表,因此我想使用番石榴将这个列表划分为最大大小为500的子列表 并将其传递给请求以获取结果DTO列表。如何在 Java8 中执行此操作?

  • 我写了一个简单的检查方法来检查MySQL数据库中是否存在给定字符串ID的数据: 查询: 我可以用MySQL workbench确认表中没有我请求的id的数据(实际上根本没有数据),但条件的计算结果为true。以下是ResultSet的调试输出: 起初,“InvalidRowReason”使我相信它正在评估为真,因为索引实际上在第一个索引之前,但是 isBeforeFirst()的文档状态如下: 如

  • Contact实体定义了与两个MySQL表中存在的email和nickname类型的实体集合的关系。 我的问题是返回的结果集有重复的电子邮件和昵称。 当重复发生时,Hibernate正在运行以下操作。 问候你,伊恩。

  • 问题内容: 我在第一次调用它返回值但第二次返回null的地方遇到问题(这没有关闭结果集或sql连接) 当然,该代码很容易修复,可以避免第二次调用,但是我想理解的是为什么如果第一个未调用,则第二个返回null 问题答案: 从Javadoc: 为了获得最大的可移植性,应按从左到右的顺序读取每一行中的结果集列,并且每一列只能读取一次。 在后台,您正在消耗TCP流中的字节,因此不能两次检索相同的列值也就不