0

JPA エンティティの 1 つに次のフィールド定義があります。

@Column(nullable = false, name = "start_time",
columnDefinition= "TIMESTAMP WITH TIME ZONE")
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date startTime = new Date();

@Column(nullable = true, name = "end_time",
columnDefinition= "TIMESTAMP WITH TIME ZONE")
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date endTime = null;

データベースは PostgreSQL であり、タイムゾーンなしでタイムスタンプを使用することはできません。タイムゾーンに関して、挿入と更新は順調に進んでいます。いくつかのテスト データに対して SELECT JPQL クエリを実行しようとし、フィルター パラメーターが Date オブジェクトであると、問題が発生します (少なくとも私はそう思います)。OpenJPA が生成するクエリには、パラメーターにタイムゾーンが含まれていません。タイムゾーン列を使用したJPAとタイムスタンプに関するガイダンスを誰か教えてもらえますか?

4

2 に答える 2

0

データベースに格納されている場合、JPAエンティティで日付とカレンダーを使用することは避けます。 標準の JDBC 一時値には、タイムスタンプの概念がありません。

代わりに次のスタイルを使用します

private Long effectiveDate;
public Date getEffectiveDate() {
  if (effectiveDate == null) { return null; }
  return new Date(effectiveDate);
}
public void setEffectiveDate(Date d) {
  if (d == null) { effectiveDate = null; }
  effectiveDate = d.getTime();
}

事実上、データベースに格納されるデータは単純な long 値です。ただし、アプリケーション層では、タイムゾーンの概念を持つ Date オブジェクトを引き続き使用します。

場合によっては、データベース レベルでクエリの目的で日付を保存したいことがあります。その場合、次のことができます

private Long effectiveDate;
private Date effectiveDateDate;
public Date getEffectiveDate() {
  if (effectiveDate == null) { return null; }
  return new Date(effectiveDate);
}
public void setEffectiveDate(Date d) {
  effectiveDateDate = d;
  if (d == null) { effectiveDate = null; }
  effectiveDate = d.getTime();
}
于 2011-11-24T12:45:29.810 に答える
-3

java.util.Calendar を見ることができます。

于 2010-03-30T14:34:50.417 に答える