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

Tom*_*ton 5 sql-server hibernate

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

DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)
Run Code Online (Sandbox Code Playgroud)

Hibernate将其转换为:

DATEADD(mytablename0_.DD, DATEDIFF(mytablename0_.DD, 0, GETDATE()), 0)
Run Code Online (Sandbox Code Playgroud)

我已经仔细检查过我的方言是SqlServer.我也换DDDAY,但问题仍然存在.

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

小智 8

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

我对此字段的原始映射如下:

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

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

dateadd( table0_.dd, table0_.lost_date, '01-JAN-1970')
Run Code Online (Sandbox Code Playgroud)

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

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

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

dateadd("dd", table0_.lost_date, '01-JAN-1970')
Run Code Online (Sandbox Code Playgroud)