2012-03-30 9 views
5

我々は、それ自体の特性を計算するために真夜中に今日の日付を必要と式プロパティを持つエンティティの列を持っている:休止扱いSQL ServerのDatepartsは

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

Hibernateはにこれを変換

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

私の方言がSqlServerであることを二度確認しました。私もDDDAYに置き換えましたが、問題は残ります。

DDはキーワードであることをhibernateに認識させるにはどうすればよいですか?

答えて

8

のSybaseからのSQLServerにアップグレードするとき、私は同じ問題を持っていました。私のシナリオのフィールドは、1970年1月1日以降の日付の格納に使用された整数フィールドでした。その整数を正規の日付に変換するためにDATEADD関数が使用されたため、マップされたオブジェクトを休止状態にして適切な表現ができました。このフィールドの

私の元のマッピングは、以下の通りであった:

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

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

これは、データベースに渡されたSQLがした質問で説明した問題が生じました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') 
0

おそらく、DATEPARTキーワードを使用しない別の表現で置き換えることができます。 例 - 前後にVARCHARに変換:

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

注釈で同じ問題が発生しました。日付部分を引用すると、私にとってもうまくいった。

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