2011-08-10 6 views
6

w bazie moja kolumna jest typu TIMESTAMP, więc moja klasa ma właściwości typu DateTime tak:coraz DateTime od ResultSet w JdbcTemplate

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

teraz w JdbcTemplate chcę dostać, więc niektóre kodu podobnego :

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

który nie działa, ponieważ kolumna get dla wynikowego nie mogłem znaleźć coś, co zwraca DateTime, tylko widziałem ani getDate lub getTime.

Odpowiedz

13

To dlatego DateTime nie jest standardowy typ Java. Jeśli masz na myśli typu JodaTime, a następnie spróbuj tego:

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

To złamie jeśli rs.getTimestamp powraca null, więc może chcesz przerwać to na mniejsze sprawozdania i dodać sprawdza null.

Należy pamiętać, że może to być łatwiejsze, ponieważ konstruktor DateTime „s trwa java.util.Date, który Timestamp jest podklasą:

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

Ale to też źle, z powodu złej konstrukcji klasy Timestamp (patrz javadoc w celu wyjaśnienia).

stick z pierwszym przykładzie (z getTime())

+0

dziękuję, więc nadal otrzymujemy tylko remis z .getTime() i przekazanie go do nowego DateTime, a następnie co się stało do daty? – Bohn

+1

@BDotA: 'Timestamp.getTime()' jest źle nazywane - zwraca milisekundy od 1 stycznia 1970 r., A więc zawiera części daty i czasu. – skaffman

+0

rs.getTimestamp() zwróci wartość nieprzetworzoną z bazy danych, ale * w strefie czasowej JVM *. Jeśli przechowujesz wartości UTC w bazie danych, nowy DateTime (rs.getTimestamp()) zwróci nieprawidłowe wartości - offset, niezależnie od przesunięcia UTC. –

1

spróbuj:

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

Dzięki, dlaczego "getMillis()"? – Bohn