2011-02-11 66 views
4

我正在使用CriteriaBuilder和CriteriaQuery構建我的查詢到數據庫,但是我遇到了一個我不知道如何解決的問題,因爲我對這個稱爲JPA的整個考驗非常新穎。Java持久性標準; Cast Expression <Timestamp> to Expression <Long>?

在Java中,我有一個名爲時間戳一個名爲報告類屬性,它被設置爲相應@TemporalType相同。 我也有一個類叫加盟它有一個列表報告對象。

在我的詢問,我想獲取所有沒有在最後Affiliate.maxSilenceMinutes一個報告加盟對象。

我的問題:

  1. 是否有標準化的JPA任何方式修改日期?像CriteriaBuilder.subtractMilliseconds(表達式<時間戳>,長)的種類?
  2. 如果沒有,有沒有辦法投表達<時間戳>表達<朗>,這樣我可以在currentTimestamp字面來得到一個CriteriaBuilder.lessThanOrEqualTo最小值(greatestReportTimestampMs減, minimumAllowedMs)

我知道這可能會感覺像一個令人困惑的問題,但主要部分很簡單:是否有可能去表達<時間戳>表達<朗>?如果我嘗試使用.as(Long.class)方法,但它在大多數DB中應該是默認的基礎數據類型,它會引發異常?

希望你們能幫助,因爲我覺得自己有種被卡住:)

回答

0

1. 如果你知道你想查詢的時間減去值, 你可以事先減: 日曆C =新的日曆(); c.setTime(timestamp.getTimestamp()); c.add(DAY, - someNumberOfDays); //或任何你想要的單位 日期d = c.getTime();

如果沒有,你可能需要調用數據庫函數做減法,通過 CriteriaBuilder.function()

  1. CriteriaBuilder.lessThanOrEqual()適用於比較法。時間戳是可比的。 所以你可以通過新的時間戳(long ms) 構造一個時間戳,並將它與另一個表達式進行比較。

我希望這會有所幫助。

0

這不是內置到Hibernate中,所以您將需要某種自定義函數。

JDBC標準包含一個函數轉義{fn TIMESTAMPADD(SQL_TSI_SECOND, secs, timestamp)}它應該被翻譯成目標數據庫的正確的SQL,但並不是所有的JDBC實現都提供它。因此你可以添加一個自定義的StandardJDBCEscapeFunction到Hibernate的方言來獲得你需要的結果。

如果你沒有這個可用的,你必須找出正確的數據庫具體實現是什麼,這裏有很多變化。例如:

甲骨文:(timestamp + secs/86400)
的SQLServer:DATEADD(ss,secs,timestamp)
DB2:(timestamp + secs SECONDS)
MySQL的:DATE_ADD(timestamp, INTERVAL secs SECONDS)

一旦你知道它,你可以使用正確的表達作爲SQL標準。

日期時間操作在方言中沒有標準化並且在許多JDBC中沒有完全實現這一事實意味着您正在嘗試執行的操作將非常難以以數據庫中性方式編寫。

相關問題