2013-01-02 98 views
0

轉換日期時間爲長戳我有兩列的實體:在JPQL

// time when the event happened (stored in UTC) 
@Temporal(TemporalType.TIMESTAMP) 
private Date eventTime; 

// timezone offset in milliseconds 
// so local millis are eventTime.getTime() + offset 
@Basic 
private int offset; 

看來,JPQL查詢I can't use somethingWHERE eventTime + offset > :parameter。但是是否可以通過在某種程度上將eventTime鑄造成很長時間來解決問題?當然,有一個使用原生查詢的選項...

編輯: 它在標準中不被支持,在OpenJPA文檔中沒有提到,因此目前可能不可能。

回答

1

您可能無法修改表格,但是您可能只需添加另一列,即帶偏移量的計算時間戳?那麼只需將所有查詢都基於此?它也可能會產生更好的性能。

我已經解決了這樣的問題的另一種方法是創建一個SQL視圖,並基於該視圖創建一個不同的@Entity。當我需要大量複雜的計算並且不希望代碼本身具有所有這些複雜性時,我都這樣做了。當您有其他非基於JPA的應用程序想要獲取相同的信息時(例如報告引擎),這非常有用。儘管此解決方案最終使用SQL視圖,但它允許您的Java/JPA代碼不必處理原生查詢。

+0

PostgreSQL不支持計算列AFAIK(http://stackoverflow.com/questions/8250389/computed-calculated-columns-in-postgresql)。讓它實際存儲在數據庫中1)打破規範化; 2)需要大量的存儲空間(這個表最終可能會有數十億行,而且實際上有兩個時間戳,所以每行增加16個字節是一個壞主意)。實際上,用時間戳+偏移量替換偏移列會更好一些。使用視圖也可能是一個好主意。 –

0

我之前在類似情況下所做的是將setter/getters聲明爲private或protected,然後讓public @Transient getters執行所需的計算。

這解決了所有的編程問題。對於所需的jpa sql,您需要在查詢中執行適當的計算。

+0

整個問題是似乎沒有辦法在JPQL中對日期進行計算。 –