2009-08-28 89 views
2

我需要比較JPQL查詢中的兩個日期,但它不起作用。比較兩個日期與JPA

這裏是我的查詢:

Query query = em.createQuery(
    "SELECT h 
    FROM PositionHistoric h, 
      SeoDate d 
    WHERE h.primaryKey.siteDb = :site 
    AND h.primaryKey.engineDb = :engine 
    AND h.primaryKey.keywordDb = :keyword 
    AND h.date = d 
    AND d.date <= :date 
    ORDER BY h.date DESC");` 

我的參數日期是java.util.Date

我的查詢返回的對象列表,但日期是上下對我的參數。

有人知道如何做到這一點?

謝謝。

+1

你可以發佈你的'PositionHistoric'和'SeoDate'類的相關屬性註釋的片段嗎?很難理解其他情況,你的命名方案似乎很不一致。 – ChssPly76

回答

0

我建議因爲你把它傳遞給JPQL(一種SQL的),而不是使用java.util.Date

java.sql.Date。

我通常使用TIMESTAMP,而不是日期,但如果你沒有選擇..

而且是:h.date = d.date代替h.date = d?

2

,你應該使用的查詢是:

FROM PositionHistoric h 
    INNER JOIN FETCH h.date 
WHERE h.primaryKey.siteDb = :site 
    AND h.primaryKey.engineDb = :engine 
    AND h.primaryKey.keywordDb = :keyword 
    AND h.date.date <= :date 

注意,通過h.date訂購是毫無意義(因爲它指向SeoDate實體,因此實際上你被PK訂購),你不能命令通過h.date.date,因爲SeoDate映射爲many-to-one

另請注意,INNER JOIN FETCH h.date行本身並不是必需的,但它會爲您節省一些額外延遲查詢的開銷,如果實際需要在返回列表中使用SeoDate屬性。

+0

您的解決方案的問題是我獲得PositionHistoric,但我不確定此對象是否是最後一個已知日期 – Kiva

+0

您獲得** PositionHistoric實體的**列表**;所有這些將與日期早於您的參數的「SeoDate」實體相關聯。這就是您發佈的原始查詢嘗試執行的操作,除非它有效。如果您需要做其他事情,您需要澄清您的問題並準確解釋您要實現的目標。 – ChssPly76

+0

我發現我的錯誤。在我的primaryKey中,日期不包含,所以JPA每次都返回同一個對象。我在primaryKey中包含了日期,並且所有工作都正常。 感謝您的回答。 – Kiva