2013-04-04 514 views
2

我想在JPA中執行此查詢。但我在執行此查詢時遇到錯誤。如何在JPA 中使用Month(),Year()我們可以使用這些原生SQL Query.But如何使用它? 請幫助我。預先感謝!替換月,年,日期函數jpa

select model from IptExchangeratelines model where model.iptExchangerate.id=:id and " + 
       " month(model.currencyExchangeDate)=:month and year(model.currencyExchangeDate)=:year 
+0

你準確得到什麼錯誤? – 2013-04-04 06:14:01

+0

我收到未知令牌「MONTH」錯誤 – 2013-04-04 08:47:00

+0

如果您有堆棧跟蹤,您可以發佈嗎?而你的源代碼的行則拋出異常。 – 2013-04-04 08:55:13

回答

9

幾乎沒有JPA實現內置對日期/時間函數的支持。

  • 的EclipseLink

    的EclipseLink支持EXTRACT允許任何數據庫支持的日期/時間部分值是 從日期/時間萃取。 EXTRACT函數與數據庫無關,但需要數據庫支持。

    EXTRACT(YEAR, model.currencyExchangeDate),但它需要的EclipseLink的2.4.x

    FUNC允許數據庫函數從JPQL調用。它允許調用JPQL中不直接支持的任何數據庫函數。

    致電數據庫功能MyFunc(a, b, c)使用FUNC('MyFunc', a, b, c)

    您可以試試FUNC('YEAR', currencyExchangeDate)來調用'年'功能。

  • 休眠

    在HQL,你可以有日期功能,MONTH(date)DAY(date)提取所需的詳細信息。 支持的其他時間功能有:HOUR(date),MINUTE(date),SECOND(date)

  • 標準API

    CriteriaBuilder#函數():一個數據庫函數的執行創建的表達式。

    CriteriaQuery<IptExchangeratelines> cq = cb.createQuery(IptExchangeratelines.class); Root<IptExchangeratelines> exRateLine = cq.from(IptExchangeratelines.class); cq.where(cb.equal(cb.function("year", Integer.class,
    exRateLine.get(exRateLine_.currencyExchangeDate)), year) .and(cb.equal(cb.function("month", Integer.class, exRateLine.get(exRateLine_.currencyExchangeDate)), month)));

+0

我也嘗試過提取物,但我得到未知的標記-EXTRACT.We正在使用JPA 2.0 – 2013-04-04 08:48:15

+0

哪個提供程序/版本?對於EclipseLink,您需要2.4。 – James 2013-04-04 12:59:06

+0

@James謝謝你補充說明,更新後。 – 2013-04-04 16:26:01

1

DataNucleus將JPA jhas內建了對年,月,日,時,分,秒,以及在JPA 2.1標準的 「FUNCTION」 支持在RDBMS調用本地函數。

根據我的經驗,所有JPA實現都支持這樣的事情,而不像其他答案給出的印象

相關問題