3

次のコードでネイティブSQLを使用してクエリを作成しています

private <T> List<T> executeNativeQuery(String queryString,
        Map<String, Object> param, Class<T> clazz) {
    Query query = entityManager.createNativeQuery(queryString);
    if (param != null && param.size() > 0) {
        for (Map.Entry<String, Object> entry : param.entrySet()) {
            query.setParameter(entry.getKey(), entry.getValue());
        }
    }
    List<T> resultList = query.getResultList();
    return resultList;
}

そして、次のデータベース結果を取得します。

VendorName | IncidentID | IncidentStatus | IncidentDate
-------------------------------------------------------
XYZ        | 100        |     Open       | 02-JUN-2011    
ABC        | 101        |     Closed     | 03-JUN-2011  
MNP        | 102        |     Open       | 01-JUN-2011  
LPQ        | 103        |     Open       | 01-APR-2011  

この結果を繰り返すために、次のアプローチを使用しています

 Iterator iter=resultList.iterator();
    while (iter.hasNext()) {
        Object[] result= (Object[]) iter.next();
        System.out.println("Vendor Name-->" +result[0]);
 }

リストを反復処理するより良い方法はありますか?

4

2 に答える 2

7

1 つの「より良い方法」(Java 5+ for-each) は、イテレータを使用して実際に表示されたものに変換されますが、構文はより優れています。

for (Object[] result : resultList) {
    // ...

もう 1 つの「より良い方法」は、リストのサイズを知っていて、for ループでカウンターを使用できるという事実に依存しています。

for (int i = 0; i < resultList.size(); i++) {
    Object[] result = resultList.get(i);
    // ... the rest ...

要約すると、リストを反復処理する方法はいくつかありますが、「より良い」方法があることは議論の余地があります: それはユースケースの問題です (そのiカウンターを他のものにも使用している場合、または使用している場合)リストからいくつかの要素を削除するiteratorこともできます) または単に好みの問題 (低レベル vs. 構文糖) です。

于 2013-06-20T19:02:11.677 に答える
0

Java 5 以降では、for each ループが推奨される方法です

for (Object[] result : resultList) {...}

コレクションのサイズを 1 回計算するため、パフォーマンスが向上する場合があります。また、従来の for ループを使用し、2 つのコレクションに対してネストされた反復を実行すると、バグが発生する可能性があります。Joshua Bloch は、彼の著書「Effective Java」の項目 46 でそれについて言及しています。

http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683/ref=dp_ob_title_bk

于 2013-06-20T19:46:22.403 に答える