2014-05-07 43 views
0

我在我的表中有兩個日期列,START_DATEEND_DATE。我使用的是Oracle XE 11g數據庫,並且已經瞭解到我可以只選擇部分日期(如月份)。我希望我的物品有startMonth,endMonth,startHourendHour。我知道如何從數據庫中的兩列中選擇這些東西(as this article explains),但我無法弄清楚如何將它們映射到變量。有沒有辦法將一列的一部分映射到一個變量?

有點進一步的解釋,開始時間和結束時間表示在從開始月份到結束月份期間的每日可用性。我使用Eclipse Kepler,Spring IDE 3.5和Hibernate 4.3.5,如果有任何區別的話。

這張表一旦填充就不會改變,所以我不會保存任何東西從對象到數據庫,只是從數據庫中讀取數據。

回答

2

你只需要一個Formula

有時候,你希望數據庫爲你做一些計算而不是在JVM中,你也可以創建某種虛擬列。您可以使用SQL片段(又名公式),而不是將屬性映射到列中。這種屬性是隻讀的(其值由您的公式片段計算)。

@Formula("obj_length * obj_height * obj_width") 
public long getObjectVolume() 

這就是說,要非常小心:在給定的時區一個給定的日期可能不是在同一個月在另一個時區相同的日期。如果你處理多個時區,使用數據庫來判斷這是一種無法工作的策略。

另外,請注意,如果您在Java代碼中更改日期的值,然後詢問月份的值,則不會得到新日期的月份,而是月份的值最初被加載。也許你應該簡單地創建一個getter方法,根據每次調用當前日期來計算月份。但是,這不會讓您根據月份創建查詢。

+0

感謝您指點我正確的方向!看起來你可以在公式中輸入Select語句以及傳統公式/計算。 – Tajha

0

做手工,你可以添加字段查詢:

select TO_CHAR(START_DATE,<your pattern for hour>) as START_HOUR, 
     TO_CHAR(START_DATE,<your pattern for month>) as START_MONTH, 
     ... 

,然後輕鬆地將它們映射,因爲如果你的表有你所需要的4個領域。

另一種選擇是有您需要的字段的每個部分setter和多幹將,一個:

setStartDate(date) { 
    this.startDate=date 
} 
getStartMonth() { 
    return this.startDate.get(Date.MONTH) + 1; 
} 
+0

我不確定我明白你的意思。我沒有使用查詢映射其他任何東西,因爲我使用Hibernate。其他一切都直接映射到列。 – Tajha

+0

好吧,然後檢查@JBNizet的答案,這是相同的,但使用休眠功能。我想如果你使用JPA和實體管理器,它會更好。 –

相關問題