gpt4 book ai didi

java - IN 子句在PreparedStatement 上仅返回 1 行

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:21 25 4
gpt4 key购买 nike

我正在尝试优化工作中在 Java 程序上执行的查询。我们必须生成大量数据来测试程序,并且执行查询需要 2~3 小时。今天,程序为我们之前存储在 ArrayList 上的每个数据创建一个“SELECT”行。我正在尝试创建一个带有 IN 子句的查询,其中包含 1000 个参数。我已经在这里搜索了一些其他示例,但是我现在遇到的错误与我迄今为止发现的所有错误都不同。查询字符串创建得很完美,有 1000 个“?”我用“for”设置了 1000 个参数,正如您在代码中看到的那样。但是当我执行查询时,我的 ResultSet 对象仅返回 1 行,而不是数据库中的 1000 行。这里的代码是根据我工作中的代码改编的,由于保密原因我无法发布原始代码。工作中是Oracle环境,家里是MySQL环境。

希望我的解释可以有人帮助我!提前致谢!

public ArrayList<String> getDadosIn(ArrayList<String> lista)
{
PreparedStatement ps = null;
ResultSet rs = null;
ArrayList< String > listaDados = new ArrayList< String >();

Connection conn = ConnectionUtil.getDBConnection();

try
{
StringBuilder query = new StringBuilder();
Calendar calendar = Calendar.getInstance();
NumberFormat numberFormat = new DecimalFormat( "00" );

System.out.println( "Begin query: " +
numberFormat.format( calendar.get( Calendar.DAY_OF_MONTH ) ) + "/" + // Dia
numberFormat.format( calendar.get( Calendar.MONTH ) + 1 ) + "/" + // Mês
calendar.get( Calendar.YEAR ) + "-" + // Ano
numberFormat.format( calendar.get( Calendar.HOUR_OF_DAY ) ) + ":" + // Hora
numberFormat.format( calendar.get( Calendar.MINUTE ) ) + ":" + // Minuto
numberFormat.format( calendar.get( Calendar.SECOND ) ) ); // Segundo

query.append( "SELECT ID_CLIENTE FROM CLIENTE WHERE ID_CLIENTE IN (" );

int i = 1;
int countAux = 0;
int countElements = 0;

for ( int k = 0; k < lista.size(); k++ )
{
query.append( "?," );

countAux++;
countElements++;

if(countAux >= 1000)
{
query.deleteCharAt( query.length() - 1 );
query.append( ")" );
ps = conn.prepareStatement(String.valueOf( query ) );

for ( int j = 0; j < 1000; j++ )
{
ps.setInt( i++, Integer.parseInt(lista.get(countElements - 1)) );
}

rs = ps.executeQuery();

while ( rs.next() )
{
listaDados.add( rs.getString("id_cliente") );
}

ps.close();

query.delete( 0, query.length() );
query.append( "SELECT ID_CLIENTE FROM CLIENTE WHERE ID_CLIENTE IN (" );

i = 1;
countAux = 0;

System.out.println( "Registros selecionados: " + countElements + " - lista.size = " + listaDados.size());
}
}

// verifica se ainda há registros para selecionar, uma vez que os selects acima eram executados a cada N vezes
if(countAux > 0)
{
i = 1;

query.deleteCharAt( query.length() - 1 );
query.append( ")" );

ps = conn.prepareStatement(String.valueOf( query ) );

for ( int j = 0; j < 1000; j++ )
{
ps.setInt( i++, Integer.parseInt(lista.get(countElements - 1)) );
}

rs = ps.executeQuery();

while ( rs.next() )
{
listaDados.add( rs.getString("id_cliente") );
}
ps.close();
}

calendar = Calendar.getInstance();

System.out.println( "End query: " +
numberFormat.format( calendar.get( Calendar.DAY_OF_MONTH ) ) + "/" + // Dia
numberFormat.format( calendar.get( Calendar.MONTH ) + 1 ) + "/" + // Mês
calendar.get( Calendar.YEAR ) + "-" + // Ano
numberFormat.format( calendar.get( Calendar.HOUR_OF_DAY ) ) + ":" + // Hora
numberFormat.format( calendar.get( Calendar.MINUTE ) ) + ":" + // Minuto
numberFormat.format( calendar.get( Calendar.SECOND ) ) ); // Segundo

ps.close();
conn.close();
}
catch ( SQLException e )
{
e.printStackTrace();
}

return listaDados;
}

最佳答案

有几件事:

  • 在 Integer.parseInt() 的 for 循环中,lista.get(countElements - 1) 的计数器需要更改为 j :

        for ( int j = 0; j < 1000; j++ )
    {
    ps.setInt( i++, Integer.parseInt(lista.get(countElements - 1)) );
    }

更改为

                for ( int j = 0; j < lista.size(); j++ )
{
ps.setInt( i++, Integer.parseInt(lista.get( j )) );
}
  • 对于所有 for 循环,请使用 lista.size() 作为上限以避免 IndexOutOfBounds 异常。

                for ( int j = 0; j < lista.size(); j++ )
    {
    ps.setInt( i++, Integer.parseInt(lista.get( j )) );
    }

关于java - IN 子句在PreparedStatement 上仅返回 1 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36391869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com