Hibernate将SQL Server Dateparts视为列而不是关键字

时间:2012-03-30 15:14:56

标签: sql-server hibernate

我们有一个带有公式属性的实体列,需要今天的午夜日期才能计算自己的属性:

DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

Hibernate将其转换为:

DATEADD(mytablename0_.DD, DATEDIFF(mytablename0_.DD, 0, GETDATE()), 0)

我已经仔细检查过我的方言是SqlServer。我还将DD替换为DAY,但问题仍然存在。

如何让hibernate认识到DD是关键字?

4 个答案:

答案 0 :(得分:8)

从Sybase升级到SQLServer时遇到了同样的问题。我的场景中的字段是一个整数字段,用于存储自1970-01-01以来的日期。 DATEADD函数用于将该整数转换为真正的日期,因此我们通过hibernate映射对象获得了良好的表示。

此字段的原始映射如下:

<property name="lostDate" type="date">
  <formula>dateadd(dd, lost_date, '01-JAN-1970')</formula>
</property>

这导致您在问题中描述的问题,即生成的sql传递给数据库的位置是:

dateadd( table0_.dd, table0_.lost_date, '01-JAN-1970')

使用双引号更新映射以包围dateadd关键字dd为我解决了这个问题。

<property name="lostDate" type="date">
  <formula>dateadd("dd", lost_date, '01-JAN-1970')</formula>
</property>

SQL Server 2008接受了下面生成的SQL并按预期执行。

dateadd("dd", table0_.lost_date, '01-JAN-1970')

答案 1 :(得分:1)

我遇到了同样的问题,实际上可以通过将 DD 替换为“ DD” 来解决该问题,但在某些情况下将无法使用。

解决我所有问题的另一种技术是将 DD 替换为NHibernate认可的 DAY

答案 2 :(得分:0)

也许您可以尝试将表达式替换为不使用DATEPART关键字的表达式。 示例 - 来回转换为varchar:

CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),111))

答案 3 :(得分:0)

注释时我遇到了同样的问题。引用日期部分也适用于我。

@Formula("datediff(\"YEAR\", birthdate, current_timestamp)")