2011-08-10 35 views
6

在數據庫中我的專欄是TIMESTAMP類型,所以我班有datetime類型的性質是這樣獲得的DateTime從ResultSet中:中的JdbcTemplate

public void setDiscoveryDate(final DateTime discoveryDtTm) { 
     this.discoveryDtTm = discoveryDtTm; 
    } 
現在

中的JdbcTemplate我想要得到它,所以像這樣的代碼:

variant.setDiscoveryDate(rs.getTimestamp("discovery_dt_tm")); 

不工作,因爲列的ResultSet我找不到的東西,返回日期時間的東西,我只看到了無論是GETDATE或的getTime。

回答

13

這是因爲DateTime是不是一個標準的Java類型。如果你指的是JodaTime類型,那麼試試這個:

variant.setDiscoveryDate(
    new DateTime(rs.getTimestamp("discovery_dt_tm").getTime()) 
); 

這將打破,如果rs.getTimestamp回報null,所以你可能要打破這種成更小的語句,並添加檢查null

注意,這可以更容易,因爲DateTime的構造函數需要一個java.util.Date,這Timestamp是的子類:

variant.setDiscoveryDate(
    new DateTime(rs.getTimestamp("discovery_dt_tm")) 
); 

但它也是錯誤的,由於Timestamp類的糟糕設計(見javadoc供解釋)。

堅持與第一個例子(與getTime()

+0

謝謝,所以我們仍然只能獲得與.getTime()的關係並將它傳遞給新的DateTime,那麼發生什麼事情呢? – Bohn

+1

@BDotA:'Timestamp.getTime()'命名錯誤 - 它返回1970年1月1日以來的毫秒數,因此包含日期和時間部分。 – skaffman

+0

rs.getTimestamp()將從數據庫返回原始值,但在JVM *的時區中返回*。如果您將UTC值存儲在數據庫中,則新的DateTime(rs.getTimestamp())將返回不正確的值 - 由任何UTC偏移量進行偏移。 –

1

嘗試:

variant.setDiscoveryDate(new DateTime(rs.getTimestamp("discovery_dt_tm").getTime())); 
+0

謝謝,爲什麼 「getMillis()」? – Bohn