2011-08-10 43 views
6

trong cơ sở dữ liệu cột của tôi là loại dấu thời gian, vì vậy lớp học của tôi có các tính chất của kiểu Datetime như thế này:nhận DateTime từ ResultSet trong JdbcTemplate

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

bây giờ trong JdbcTemplate Tôi muốn để có được nó, vì vậy một số mã như thế này :

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

không hoạt động vì cột lấy kết quả tôi không thể tìm thấy thứ trả về DateTime, tôi chỉ thấy getDate hoặc getTime.

Trả lời

13

Đó là bởi vì DateTime không phải là một loại Java tiêu chuẩn. Nếu bạn đang đề cập đến các loại JodaTime, sau đó thử này:

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

này sẽ phá vỡ nếu rs.getTimestamp lợi nhuận null, vì vậy bạn có thể muốn chia nhỏ ra thành các báo cáo nhỏ hơn và thêm kiểm tra cho null.

Lưu ý rằng điều này có thể được thực hiện dễ dàng hơn, vì DateTime 's constructor mất một java.util.Date, mà Timestamp là một lớp con của:

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

Nhưng nó cũng sai, do thiết kế xấu của lớp Timestamp (xem javadoc để được giải thích).

Gắn ví dụ đầu tiên (với getTime())

+0

cảm ơn, vì vậy chúng tôi vẫn chỉ nhận được tie với .getTime() và chuyển nó đến DateTime mới, sau đó những gì happends để Ngày? – Bohn

+1

@BDotA: 'Timestamp.getTime()' được đặt tên không đúng - nó trả về mili giây kể từ ngày 1 tháng 1 năm 1970 và bao gồm cả phần ngày và giờ. – skaffman

+0

rs.getTimestamp() sẽ trả về giá trị thô từ cơ sở dữ liệu, nhưng * trong múi giờ của JVM *. Nếu bạn lưu trữ các giá trị UTC trong cơ sở dữ liệu, thì DateTime mới (rs.getTimestamp()) sẽ trả về các giá trị không chính xác - được bù đắp bằng bất kỳ giá trị bù trừ UTC nào. –

1

Hãy thử với:

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

cảm ơn, tại sao "getMillis()"? – Bohn

Các vấn đề liên quan