用Java实现虚拟列表

时间:2009-07-28 10:27:17

标签: java sql rdbms

我需要从Java(10-20k)的RDBMS中获取许多记录,我的目标系统希望它们可以作为Java List使用。所以我想将我的代码实现为“虚拟列表”,其中我实际上只获取我实际需要的记录。我希望SQL像

SELECT * FROM CUSTOMER WITH COUNTRY =“Moldovia”

作为参数,只返回请求的内容。很可能这些数据是50批次请求的。任何提示如何做到这一点?

2 个答案:

答案 0 :(得分:2)

除非您希望客户随机访问数据,否则最好还是退回Iterator。另外,请查看ResultSet.setFetchSize:http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html#setFetchSize(int)

类似于:

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;

public class FooResultSetIterator implements Iterator<Foo>
{
  private final ResultSet resultSet;
  private boolean hasNext;

  FooResultSetIterator(final ResultSet resultSet, final int fetchSize) throws SQLException
  {
    this.resultSet = resultSet;
    this.resultSet.setFetchSize(fetchSize);
    this.hasNext = resultSet.next();
  }

  @Override
  public boolean hasNext()
  {
    return hasNext;
  }

  @Override
  public Foo next()
  {
    final Foo foo = new Foo(resultSet);
    try
    {
      this.hasNext = resultSet.next();
    }
    catch (final SQLException e)
    {
      throw new RuntimeException(e);
    }
    return foo;
  }

  @Override
  public void remove()
  {
    throw new UnsupportedOperationException("Cannot remove items from a ResultSetIterator");
  }

}

class Foo
{
  public Foo(ResultSet resultSet)
  {
    // TODO Auto-generated constructor stub
  }
}

答案 1 :(得分:1)

在查询中使用OFFSET和LIMIT:

  

SELECT * FROM CUSTOMER WHERE   COUNTRY =“Moldovia”LIMIT 50 OFFSET 50

当然假设你的SQL方言允许它。该示例将返回行51-100。