2009-07-11 7 views
0

とのタイムスタンプは、私は私のJPAエンティティの一つで、次のフィールドの定義を持っている:JPQLとタイムゾーン

@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とタイムゾーンの列に関するタイムスタンプに関するガイダンスを誰かに教えてもらえますか?

答えて

-1

あなたはjava.util.Calendarを見ることができます。

0

データベースに格納されているJPAエンティティでDateとCalendarを使用しないでください。 標準 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(); 
}