2011-09-12 5 views
4

3.3.0.GAからHibernate 3.6.5.Finalに更新され、XMLマッププロパティのSQL式呼び出しで問題が発生しました。3.6.5への更新後にHibernate mappedプロパティがSQL式に失敗しました

<property 
    name="endDate" 
    type="java.util.Date" 
    formula="TIMESTAMPADD(SECOND, (quantity*60*60), transactionDate)" 
/> 

* .xml.hbmでは何も変更されておらず、データベース設計も変更されていません。以前、私のendDateにはきちんと計算したところ、私は今MySQLSyntaxErrorExceptionを得る:this_.SECONDSECONDする必要があることに

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'this_.SECOND,(this_.quantity*60*60),this_.transactionDate) as formula0_0_ from t' at line 1 

問題はかなり明白です。 Hibernateは式としてを静的に渡されたパラメータとして認識せず、したがってテーブル内の列でなければならないと考えます。私はそれが使用する必要があります冬眠を教える方法がわからないSECONDです。

ダイアレクトではregisterFunctionregisterKeywordを試しましたが、HQL関数定義に関連しているように見えますが、数式でここで使用されているネイティブSQLとは思われません。

誰かが正しい方向に私を指し示すことができますか、またはこれらのバージョン間でHibernateが異なることを教えてください。どうすれば修正できますか?

答えて

1

Sql Serverで同じタイプの問題が発生しました。同様の解決策が機能する可能性があります。 。

ここに私が見つけたものがあります。 。それが\"機能しないのであればhttps://forum.hibernate.org/viewtopic.php?p=2427791

は、私は実際にあなたがこのXML属性で二重引用符をエスケープする方法を確認していないSECOND

<property 
    name="endDate" 
    type="java.util.Date" 
    formula="TIMESTAMPADD(&quot;SECOND&quot;, (quantity*60*60), transactionDate)" 
/> 

の前後に引用符を入れてみたが、私は最初&quot;をしようとし、

+0

のMySQL 5.0拒否このクエリ: 'TIMESTAMPADD選択します( "第二"、60は、CURRENT_DATE())=>あなたは "第二"」近くにあなたのSQL構文でエラーが発生しています...'。 Hibernateは引用符を削除することに注意します。おそらくMSSQLはより柔軟です:) –

+0

私はあなたが正しいトラックに私を持っていると思います。私は二重引用符と一重引用符を試しましたが、うまくいきませんでした。しかし[この記事] [1]では、[SECOND]を使って提案しています。別のプロジェクトの締め切りのため、私は明日の休止状態の更新ブランチに戻って、それがうまくいけば教えてくれます。 [1]:http://www.mkyong.com/hibernate/how-to-use-database-reserved-keyword-in-hibernate/ – joostschouten

3

私はちょうどHibernate 4.1.2にアップグレードしました。この同じ問題が戻ってきました。 [SECOND]の解決策はもはや機能しなくなり、自分のカスタムDialectにキーワードを登録する必要がありました。同様に:

public class ExtendedMySQL5InnoDBDialect extends MySQL5InnoDBDialect { 

    public ExtendedMySQL5InnoDBDialect() { 
     super(); 
     //make sure to register it in lowercase as uppercase does not work (took me 4 hours to realize) 
     registerKeyword("second"); 

    } 
} 
関連する問題