2009-07-28 12 views
1

RDBMSからJava(10〜20k)の多くのレコードをフェッチする必要があります。ターゲットシステムは、それらをJavaリストとして利用できると考えています。実際に必要なレコードだけを実際に取得する「仮想リスト」としてコードを実装したいと考えています。私は、国=「Moldovia」パラメータとしてJavaで仮想リストを実装する

とは単に要求されたものを返す顧客からの

SELECT *ようなSQL期待しています。ほとんどの場合、データは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

こんにちはSimonさん、答えは です。私はリストをする必要があります。他のシステムではそれが必要ですが、もちろんリストにはイテレータがあります。基本的に、結果は一度にテーブル50個で視覚化され、ユーザーは任意のページにジャンプすることができます。ページングナビゲータを正しくレンダリングできるように、合計サイズを取得する必要があります – stwissel

1

使用クエリでOFFSETとLIMIT:

SELECT *顧客からの 国= "Moldovia" LIMIT 50をお使いのSQL方言がそれを可能にする、もちろん仮定すると、50

を相殺しました。この例では、行51〜100が返されます。

+0

こんにちはビナイ、 。私は立ち往生した:List.sizeプロパティは、エントリの総数を返す必要があります。だから私は2つのクエリを持っています - リミットとオフセットと1つのCOUNT(*)...またはあなたはもっと効率的な何かを知っていますか? – stwissel

+0

いいえ、そうする必要があります。 –

関連する問題