【问题标题】:Hibernate Treats SQL Server Dateparts as Columns Instead of KeywordsHibernate 将 SQL Server 日期部分视为列而不是关键字
【发布时间】:2023-03-08 06:47:01
【问题描述】:

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

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

Hibernate 将其转换为:

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

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

如何让 hibernate 识别 DD 是关键字?

【问题讨论】:

    标签: sql-server hibernate


    【解决方案1】:

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

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

    <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')
    

    【讨论】:

      【解决方案2】:

      我也遇到了同样的问题,您实际上可以通过将 DD 替换为 "DD" 来解决问题,但在某些情况下它不起作用。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          我在注释方面也遇到了同样的问题。引用日期部分也对我有用。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-15
            • 1970-01-01
            • 2016-10-16
            相关资源
            最近更新 更多