数组列表中的数据重复



我想用从数据库中选择的数据填充我的 ArrayList,但它复制了我没有得到的所有行。

Connection conn = DriverManager.getConnection(url, userid, password);
String strSql = "SELECT * FROM events, eventStats" ;
PreparedStatement Stmt = conn.prepareStatement(strSql);
ResultSet rs = Stmt.executeQuery(strSql);
while(rs.next()){
Events user = new Events();
user.seteName(rs.getString(2));
user.setePlace(rs.getString(4));
user.seteDate(rs.getString(5));
user.seteInscrit(String.valueOf(rs.getInt(8)));
user.seteTotal(String.valueOf(rs.getFloat(10)));
data.add(user);
}

感谢您的帮助!

您实际上并没有看到最严格意义上的"重复"行。

您看到的是笛卡尔积,即一个表中的每一行都连接到另一个表中的每一行。你得到这个是因为你的SQL语句中有一个笛卡尔连接(或者如果你愿意的话,有一个交叉连接):

SELECT * FROM events, eventStats
--            ^^^^^^^^^^^^^^^^^^

这意味着对于events表中的每一行,您将获得等于eventStats表中行数的结果数。将它们加在一起,看起来很多重复项实际上是两个表中所有行的大量唯一组合

。在很多情况下,笛卡尔联接是可取的,但它通常是查询错误的指标,如果其中一个表特别大,可能会对系统产生巨大的性能影响。1

为了避免这种情况,您需要指定每个表中的哪一列用于将两个表连接在一起,或者通过显式连接:

SELECT *
FROM events v
[INNER|LEFT OUTER|RIGHT OUTER] JOIN eventStats s
ON v.SomeColumn = s.SomeMatchingColumn

或隐式的:

SELECT *
FROM events v, eventStats s
WHERE v.SomeColumn = s.SomeMatchingColumn

如果不看到表结构,很难告诉您更多,但是这两个表之间可能存在外键关系,这就是您要连接的列。

1笛卡尔连接将返回的行数等于连接中涉及的表大小的乘积。例如,假设events表包含 50,000 行,eventStats表也有 50,000 行,每个event一个。通过对这些表进行笛卡尔连接,您的查询将返回高达2,500,000,000,000,是的,即 25亿行数据。现在想象一下,把所有这些读成ArrayList......除非你不能,因为 Java 数组不能变得那么大!在读取所有数据之前,应用程序将崩溃并显示java.lang.OutOfMemoryError: Requested array size exceeds VM limitjava.lang.OutOfMemoryError: Java heap space

相关内容

  • 没有找到相关文章

最新更新