2016-02-05 76 views
0

我嘗試使用CollectionStringBuilder中包含的對象進行SQL查詢。這似乎是一個非常簡單的代碼來寫:集合和StringBuilder的奇怪行爲

public String makeQuery(Collection<MyObject> collection) { 

    logger.info("The size of the collection is {}", collection.size()); 

    StringBuilder queryString = new StringBuilder("INSERT INTO my_table (my_column) VALUES "); 
    int i = 1; 
    for (MyObject object : collection) { 

     queryString.append("('"); 
     queryString.append(object.get...); 
     queryString.append("')"); 

     if (i == collection.size()) { 
      queryString.append(";"); 
     } else { 
      queryString.append(","); 
     } 
     i++; 

    } 

    logger.info("The size of the collection is {}", collection.size()); 

    return queryString.toString(); 

} 

對於我來說,這個代碼應該工作,但有時我有這樣的結果:

INSERT INTO my_table (my_column) VALUES ('a'),('b');('c'), 

這怎麼可能,半結腸是不最後的字符?

編輯

我在循環之前和之後添加日誌和集合的大小總是相同的。

+4

使用'PreparedStatement'。另外看看[這裏](http://stackoverflow.com/questions/35205617/is-there-simple-regex-to-convert-java-string-list-to-oracle-in-condition/)。 – Mena

+1

是集合共享給其他線程? – AdamSkywalker

+0

@AdamSkywalker只有當我的程序中有一個錯誤。我會看看那個。 – cheb1k4

回答

1

你可以嘗試使用Iterator()並直到hasNext()只是做正常的附加。當hasNext()返回false時,只需追加';'。那時候不需要額外的東西。

+0

或者,如果您想堅持使用當前循環,只需添加逗號,然後在循環[delete](https://docs.oracle.com/javase/7/docs/api/java/lang/ StringBuilder.html#deleteCharAt(int))結尾的逗號並用分號替換 – rbennett485

+0

對於我來說,使用Iterator或每個循環都是非常相同的事情。某處我需要測試來檢查它是否是最後一個元素。也許你可以啓發我如何去做。 – cheb1k4

+0

當它是最後一個元素時,hasNext返回false。所以在一段時間(iter.hasNext())並追加';' while循環之後。只要將iter.next()添加到StringBuilder中即可。 – swell