我们有一个带有公式属性的实体列,需要今天的午夜日期才能计算自己的属性:
DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)
Hibernate将其转换为:
DATEADD(mytablename0_.DD, DATEDIFF(mytablename0_.DD, 0, GETDATE()), 0)
我已经仔细检查过我的方言是SqlServer。我还将DD
替换为DAY
,但问题仍然存在。
如何让hibernate认识到DD是关键字?
答案 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)")