ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|---|
|
エラーの状況
java.lang.ClassCastException:
java.util.Date cannot be cast to java.sql.Timestamp
at com.example.UserService.process(UserService.java:42)
# または逆方向
java.lang.ClassCastException:
java.sql.Timestamp cannot be cast to java.util.Date
Date 型の関係を理解
| 型 | パッケージ | 用途 |
|---|---|---|
java.util.Date | java.util | 日時の汎用型(古い) |
java.sql.Date | java.sql | SQL DATE 型(時刻なし) |
java.sql.Time | java.sql | SQL TIME 型(時刻のみ) |
java.sql.Timestamp | java.sql | SQL TIMESTAMP 型(日時 + ナノ秒) |
java.time.LocalDate | java.time | 日付(Java 8+ 推奨) |
java.time.LocalDateTime | java.time | 日時(Java 8+ 推奨) |
java.time.ZonedDateTime | java.time | タイムゾーン付き日時 |
継承関係:
java.util.Date
├── java.sql.Date (extends Date)
├── java.sql.Time (extends Date)
└── java.sql.Timestamp (extends Date)
# つまり java.sql.* は全部 java.util.Date のサブクラス
# だが ClassCastException は逆方向 (親 → 子) のキャストで発生
原因と対処
原因 1: getObject() / 戻り値から強引にキャスト
// JDBC で取得
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Object val = rs.getObject("created_at"); // 型が決まらない
Timestamp ts = (Timestamp) val;
// → val が Date だった場合 ClassCastException
}
// 修正: 専用メソッド使用
Timestamp ts = rs.getTimestamp("created_at");
Date date = rs.getDate("birthday");
// または LocalDateTime 直接 (JDBC 4.2+)
LocalDateTime dt = rs.getObject("created_at", LocalDateTime.class);
LocalDate d = rs.getObject("birthday", LocalDate.class);
原因 2: JPA エンティティの型不一致
// ❌ ダメな例
@Entity
public class Event {
@Id @GeneratedValue
private Long id;
@Column(name = "scheduled_at")
@Temporal(TemporalType.TIMESTAMP)
private Date scheduledAt; // java.util.Date
}
// Native Query で TIMESTAMP を取得すると
List<Event> events = em.createNativeQuery(
"SELECT scheduled_at FROM events"
).getResultList();
Timestamp ts = (Timestamp) events.get(0); // ← util.Date を sql.Timestamp にキャストでエラー
// 修正: LocalDateTime に変更 (推奨)
@Column(name = "scheduled_at")
private LocalDateTime scheduledAt;
原因 3: Object[] からのキャスト
// JPQL の SELECT で複数値
@Query("SELECT u.id, u.createdAt FROM User u")
List<Object[]> findUserDates();
// 利用側
for (Object[] row : userRepository.findUserDates()) {
Long id = (Long) row[0];
Timestamp ts = (Timestamp) row[1]; // 型が Date or LocalDateTime の可能性
// → ClassCastException
}
// 修正: DTO 投影
@Query("SELECT new com.example.UserDateDto(u.id, u.createdAt) FROM User u")
List<UserDateDto> findUserDates();
public class UserDateDto {
private Long id;
private LocalDateTime createdAt;
public UserDateDto(Long id, LocalDateTime createdAt) { ... }
}
各型の変換方法
// 旧型同士
Date utilDate = new Date();
Timestamp ts = new Timestamp(utilDate.getTime());
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
// 旧型 → java.time
Date utilDate = new Date();
LocalDateTime ldt = utilDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalDate ld = utilDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
Timestamp ts = new Timestamp(System.currentTimeMillis());
LocalDateTime ldt = ts.toLocalDateTime();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
LocalDate ld = sqlDate.toLocalDate();
// java.time → 旧型 (DB 連携のため)
LocalDateTime ldt = LocalDateTime.now();
Timestamp ts = Timestamp.valueOf(ldt);
Date utilDate = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
LocalDate ld = LocalDate.now();
java.sql.Date sqlDate = java.sql.Date.valueOf(ld);
Hibernate 5+ で java.time 直接使用
@Entity
public class Event {
@Id @GeneratedValue
private Long id;
// LocalDate → DATE
private LocalDate eventDate;
// LocalDateTime → TIMESTAMP
private LocalDateTime createdAt;
// ZonedDateTime → TIMESTAMP WITH TIME ZONE (PostgreSQL)
private ZonedDateTime publishedAt;
// OffsetDateTime → TIMESTAMP WITH TIME ZONE
private OffsetDateTime updatedAt;
// Instant → TIMESTAMP (UTC)
private Instant timestamp;
}
// @Temporal は不要 (Java 8+ では非推奨)
Spring Data JPA でのソート / フィルタ
// Date 型で問題が起きるパターン
public List<Event> findRecent() {
return eventRepository.findByCreatedAtAfter(
Date.from(Instant.now().minus(7, ChronoUnit.DAYS))
);
}
// 推奨: LocalDateTime で一貫
public List<Event> findRecent() {
return eventRepository.findByCreatedAtAfter(
LocalDateTime.now().minusDays(7)
);
}
// Repository
public interface EventRepository extends JpaRepository<Event, Long> {
List<Event> findByCreatedAtAfter(LocalDateTime threshold);
List<Event> findByEventDateBetween(LocalDate from, LocalDate to);
}
JSON シリアライズ (Jackson)
// Date 型の出力
new ObjectMapper().writeValueAsString(new Date());
// → "1684123456789" (タイムスタンプ数値) ← 読みにくい
// 設定
ObjectMapper om = new ObjectMapper();
om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
// → "2026-05-15 12:00:00"
// java.time 対応
om.registerModule(new JavaTimeModule());
om.writeValueAsString(LocalDateTime.now());
// → "2026-05-15T12:00:00"
// Spring Boot 自動設定 (application.properties)
spring.jackson.serialization.write-dates-as-timestamps=false
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=Asia/Tokyo
推奨される対処
- 新規コードは java.time のみ使う: LocalDate / LocalDateTime / Instant / ZonedDateTime
- 既存コード: Date を見つけたら徐々に LocalDate / LocalDateTime に置き換え
- JPA エンティティの型統一: 全エンティティで java.time を使用
- DB 側: TIMESTAMP / DATE / TIME を適切に使い分け
- タイムゾーン: アプリ全体で UTC または明示的 ZoneId 統一
関連エラー
ParseException: Unparseable date: 日付文字列パース失敗 (SimpleDateFormat)DateTimeParseException: 同様 (DateTimeFormatter)java.time.DateTimeException: 不正な日時値ZoneRulesException: 不正なタイムゾーン
関連記事
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- java.lang.NoSuchMethodError
- java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
- java.lang.UnsupportedClassVersionError
- version less than X.X is not supported.
- パッケージ~は存在しません
- org.apache.jasper.JasperException: ...The jsp:param action must not be...
- java.io.FileNotFoundException: ファイル名 (許可がありません)
- java.sql.SQLException: Cannot convert value 'YYYY-MM-DD ...' from column n(YYYY-MM-DD ...) to TIMESTAMP.
- 警告: この文字は、エンコーディング[文字コード]にマップできません
- java.text.ParseException: Unparseable date
- Unsupported major.minor version 52.0
- エンティティ" ... "への参照は';'デリミタで終了する必要があります。
- java.math.BigDecimal cannot be cast to java.lang.String
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 Spring Frameworkのアノテーション一覧
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- PHPでのファイルアップロード方法|multipart/form-dataと$_FILES 2026-08-07 17:15:57
- PHP $_SERVERとは|DOCUMENT_ROOT・PHP_SELFなど主な要素 2026-08-07 17:15:57
- Scratchのアカウントの作り方|メールアドレスとユーザー名の登録手順 2026-08-07 17:15:57
- djangoにおけるMVCアプリケーション実装例 2026-08-07 17:15:57
- Bluetoothとは|仕組み・BLEとClassicの違い・用途 2026-08-07 17:15:57
- Spring Bootのテスト入門|@SpringBootTestとJUnitでの単体・結合テスト 2026-08-07 17:15:57
- APIキー取得方法 2026-08-07 17:15:56
- インストール方法(Windows版) 2026-08-07 17:15:56
- Java とは?言語仕様・JVM・主要フレームワーク一覧 2026-08-07 17:15:56
- 【PHPフレームワーク】Laravelの使い方 2026-08-07 17:15:56
- Scratch 作品の公開方法 2026-08-07 17:15:56
- Google OAuth 2.0 認証の実装方法 2026-08-07 17:15:56
- データベースとは?RDB / NoSQL / SQL の基礎 2026-08-07 17:15:56
- インストール(eclipseプラグイン) 2026-08-07 17:15:56
- Spring Frameworkの使い方 2026-08-07 17:15:56
コメントを削除してもよろしいでしょうか?