2016-06-01 9 views
1

私たちは、Hibernate 3.0.3を使用するレガシーアプリケーションを持っています。私たちはHSQLDBで単体テストを行います。スキーマ名「transactio0_が」NVL関数の前に付加されていることをHibernateがHsql関数にスキーマ名を追加するのはなぜですか?

select 
transactio0_.REASON_ID as REASON1_0_, 
transactio0_.DESCRIPTION as DESCRIPT2_93_0_, 
transactio0_.REASON_NAME as REASON3_93_0_ 
from APPS.MTL_TRANSACTION_REASONS transactio0_ 
where transactio0_.REASON_ID=54 
and transactio0_.NVL (transactio0_.disable_date, NOW() + 1 DAY) > NOW() 

注:Hibernateが生成されたクエリの一つは、このようになります。どうして? Hibernateをどうやって設定すればいいのですか?

次に、使用しているHSQLDBのバージョンについて説明します。現在、HSQLDB 2.2.8を使用しており、HSQLDB 2.3.2に移行したいと考えています。 上記のクエリはHSQLDB 2.2.8でうまく動作しますが、 "無効なスキーマ名"のエラーでHSQLDB 2.3.2で失敗します。 HSQLDB 2.2.2のようにクエリを正常に実行できるようにHSQLDB 2.3.2を設定できる方法はありますか?

答えて

1

生成されたSQLは奇妙に見えますが、確かに間違ったSQLです。 transactio0_はテーブルのエイリアスであり、任意の関数名の前に付けるべきではありません。

おそらく、選択されたHibernate方言はHSQLDB方言ではありません。

いずれにしても、これはHibernateの古いバージョンで、リリース時期に近いバージョンのHSQLDBで使用する必要があります。

不正な形式の名前を受け入れるようにHSQLDBを設定することについては、あまりにも甘すぎて誤ったSQLを受け入れたため、元の動作が修正されている必要があります。

1

私も同様の問題がありました。これを修正するには、関数名とともに "()"を入れる必要があります。たとえば:

and NVL (transactio0_.disable_date, NOW() + 1 DAY) > NOW()

別の言葉で

and NVL(transactio0_.disable_date, NOW() + 1 DAY) > NOW()

への変更、は空白文字を削除します。

関連する問題