2009-07-28 2 views
1

Мне нужно собрать много записей из РСУБД в Java (10-20 тыс.), Моя целевая система ожидает их доступности в виде Java-списка. Поэтому я хочу реализовать свой код как «Виртуальный список», где я на самом деле получаю только нужные записи. Я ожидаю SQL какРеализация виртуального списка в Java

SELECT * FROM CUSTOMER WHERE COUNTRY = "Молдавии"

в качестве параметра и просто вернуть то, что просят. Скорее всего, данные запрашиваются в партиях по 50. Любые подсказки, как это сделать?

ответ

2

Если вы не ожидаете, что ваши клиенты будут случайным образом получать доступ к данным, вам, вероятно, лучше будет возвращать итератор. Кроме того, обратите внимание на 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 
    } 
} 
+0

Hi Simon, THX для ответа. Мне нужно сделать список. Другая система требует этого, но, конечно, список имеет итератор. В основном результаты будут визуализироваться в таблице по 50 записей за раз, и пользователь может перейти на любую страницу. Поэтому мне нужно получить общий размер, чтобы навигатор пейджинга мог отображаться правильно – stwissel

1

Используйте OFFSET и LIMIT в вашем запросе:

SELECT * FROM CUSTOMER WHERE COUNTRY = LIMIT "Молдавии" 50 OFFSET 50

Предполагая, конечно, что ваш SQL диалект позволяет это. Пример вернет строки 51-100.

+0

Hi Вина, Я думал об этом. Где я застрял: свойство List.size должно вернуть общее количество записей. Итак, у меня было бы 2 вопроса - с LIMIT & OFFSET и один с COUNT (*) ... или вы бы знали что-то более эффективное? – stwissel

+0

Нет, это то, что вам нужно будет сделать. –