2014-05-07 42 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和实体管理器,它会更好。 –

相关问题