2017-09-12 8 views
0

これは奇妙な問題です。私は小さな間違いをしているが、正確に何かを理解することができないことを知っている。Javaを使用して結果セットのサイズを検証しない

私は1つのクエリを実行しており、結果セットがあります。まず、レコードがないかどうかを確認し、DTO属性の1つをfalseに設定します。それがレコードを持っている場合、繰り返し、いくつかのビジネスを行います。

rs = partyPreparedStatement.executeQuery(); 

if(!rs.next()) { // It has records, but I'm checking with ! operator to make sure it goes to false or true. 
    purchaseDto.setPOIssued(false); 
} else { 
    while (rs.next()) { // It has records, but still its not going to execute business 
     // Do some business here.    
     break; 
    }     
} 

デザインは正しいですか?

+0

にループで、しばらくはない最善のアプローチは、ここに – Flown

+1

でしょうか? – khelwood

答えて

1

を。

最初にnext()を呼び出すと、すでにResultSetが(データがある場合)最初の行に配置されます。しかし、あなたはその行で何もしないで、すぐにnext()whileの状態)を呼び出すと、最初の行は完全に無視されます。

どのようにあなたはこの問題を解決しますか?私は個人的には、単純に処理された行の数をカウントします:

あなたが最初の行だけを処理したい場合は、あなたが開始するためにしばらくは必要ありません。

rs = partyPreparedStatement.executeQuery(); 

if (rs.next()) { 
    purchaseDto.setPOIssued(true); 
    // process the data here 
} else { 
    purchaseDto.setPOIssued(false); 
} 
+0

私はちょうど上の最初の行が読まれることを望みます。 – Aliy

+0

ありがとうございます。 YCFソリューションはより高速ですか?どちらをお考えですか? – Aliy

+0

@Aliy:無関係とは言わない限り、パフォーマンス面は無視できます。しかし、もしあなたが**ただ**の最初の行を使用するつもりなら、 'while'ループはあなたのコードを読んでいる人を混乱させます。ループを使用せずに単一行を処理することで、意図を明確にします。 –

1

あなたがdo{}whileループを使用することができますので、代わりにカーソルを2回移動:データがはあなたが最初の行を無視しますを返された場合

if (!rs.next()) { 
    purchaseDto.setPOIssued(false); 
} else { 
    do { 
     // Do some business here.    
     break; 
    } while (rs.next()); 
} 
+0

しかし、どこに私がpurchaseDto.setPOIssued(false);を追加したいのですか? – Aliy

+0

@Aliyは何を意味しましたか? –

+1

パーフェクト。ありがとうYCF_L – Aliy

0

falseに値のデフォルトを設定し、あなたは、なぜすべてでループしている、最初の反復でループから抜け出すために計画している場合true

purchaseDto.setPOIssued(false); 

while (rs.next()) { // It has records, but still its not going to execute business 
     // Do some business here.    
     purchaseDto.setPOIssued(true); 

     break; 
    }   
関連する問題