4

我正在尝试为列表中的每个值运行一个新的 SQL 命令。我有以下内容,它只是为我列表中的金额一次又一次地重复相同的值。

请注意,我必须通过数组列表中的值数量循环 SQL,并将每个值作为名称插入 SQL 中,如下所示。

这样做的最佳方法是什么,因为这绝对不是。

    int listSize = al.size();

    for(int i = 0; i < listSize; i++) {         
        ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = '"+al.listIterator().next()+"'");
        al1.add(rs1.getString(1));
        rs1.close();

    }
    System.out.println(al1);

结果:

[70, 70, 70, 70, 70, 70, 70, 70, 70, 70]

预期结果:

[70、80、110、60、35、10、15、10、0、25]

4

7 回答 7

5

问题在

al.listIterator().next()

它始终返回相同的值。因此,查询返回相同的结果集字符串,这就是为什么你的结果总是如此70

试试这个代码:

int listSize = al.size();

for(int i = 0; i < listSize; i++) {         
    ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = '"+al.get(i)+"'");
    while(rs1.next()){
        al1.add(rs1.getString(1));
    }
    rs1.close();

}
System.out.println(al1);
于 2013-04-16T09:01:23.040 回答
3

每次您创建新的迭代器时,它每次都返回相同的值。试试下面的代码

int listSize = al.size();

    for(int i = 0; i < listSize; i++) {         
        ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = '"+al.get(i)+"'");
        al1.add(rs1.getString(1));
        rs1.close();

    }
    System.out.println(al1);
于 2013-04-16T09:03:26.117 回答
2

请用

while(rs1.next()){
  System.out.println(rs1.getString(1));
}
于 2013-04-16T08:56:07.790 回答
1

简单的答案是您需要在从结果集中读取之前执行al.get(i)和调用。rs1.next()您还应该在尝试从结果集中读取之前检查调用是否rs1.next()返回。true

但这忽略了一个事实,即在循环中执行查询很糟糕——性能会很糟糕,而且你正在敲击数据库。每次您调用name.executeQuery远程调用时都会产生所有开销,并且您正在为您正在迭代的集合中的每个项目执行此操作。如果集合中有 1000 个项目,那就是 1000 个远程调用。此外,使用字符串连接来构建查询意味着数据库必须在每次执行查询时计算查询计划。

要正确执行此操作,您应该使用准备好的语句执行单个查询,然后遍历结果集 - 1 个远程调用 - 类似于:

PreparedStatement preparedStatement = null;
ResultSet resultSet = null;

try
{
  preparedStatement = connection.prepareStatement("SELECT sum(hours) FROM project_time WHERE date = ? AND name IN ?");

  preparedStatement.setDate(1, date);
  preparedStatement.setArray(2, connection.createArrayOf("VARCHAR", al.toArray());

  resultSet = preparedStatement.executeQuery();

  List<String> hours = new ArrayList<String>();

  while (resultSet.next()) 
  {
    hours.add(resultSet.getString(1));
  }

  System.out.println(hours);
}
finally
{
  if (resultSet != null) resultSet.close();
  if (preparedStatement != null) preparedStatement.close();
}

在不知道您使用的数据库的情况下,很难知道语法是否 100%,但您应该了解要点。

于 2013-04-16T09:22:40.657 回答
0

像这样设置 for 循环以使用列表中的每个条目:

    for(String name : al) {         
        ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = '"+name+"'");
        al1.add(rs1.getString(1));
        rs1.close();

    }
    System.out.println(al1);
于 2013-04-16T09:06:11.517 回答
0

你可以用while替换for循环

Interator i = al.listIterator(); 
while(i.hasNext()){ 
    String name = i.next(); 
    ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE ="+date+"' AND name = '"+name+"'"); 
    while(rs1.next()){ 
      System.out.println(rs1.getString(1)); 
    } 
}
于 2013-04-16T09:06:59.897 回答
0

当您对 List 使用迭代器时,它会为您提供列表中的第一个元素位置,当调用 Iterator.next() 时,Iterator 会移动到嵌套元素位置。

`int listSize = al.size();

for(int i = 0; i < listSize; i++) {         
    ResultSet rs1 = name.executeQuery("SELECT sum(hours) FROM PROJECT_TIME WHERE DATE = '"+date+"' AND name = '"+al.get(i)+"'");
    al1.add(rs1.getString(1));
    rs1.close();

}
System.out.println(al1);`
于 2013-04-17T07:02:13.703 回答