2012-01-12 3 views
5

JPA永続性プロバイダをEclipseLink 2.3からHibernate 3.6.5.Finalに切り替える作業を進めています。問題はネイティブクエリーにあります。注:これはEclipseLinkの問題ではありませんでした。私はスカラー値、Stringを取得しようとしていますが、私はエンティティが宣言されていません。ここでは、コードは次のようになります。getSingleResultは、ハイバネートのネイティブスカラークエリでプロキシを返します

Query q = em.createNativeQuery("select description from foo where foo_id = ?"); 
q.setParameter(1, fooId); 
String description = (String)q.getSingleResult(); 

Hibernateで返されたオブジェクトが、実際にはプロキシオブジェクトであるので、私はClassCastExceptionを取得します。私はそれがどのタイプなのかわかりませんが、配列ではないことを知っています(object.getClass().isArray()はfalseです)、リストではないことがわかります(object instanceof Listfalseです)。

私には何が欠けていますか?

+0

'q.getSingleResult()。getClass()。getInterfaces()'はどのインタフェースを返しますか? –

+0

ああ...それは私が必要なものでした。型java.sql.Clob、org.hibernate.engine.jdbc.WrappedClob、およびjava.io.Serializableです。あなたがそれを答えるなら、私はそれを受け入れるでしょう。私は列がクローブであることを認識していないし、EclipseLinkが私のためにStringへの変換を行っていたことに驚いています。 – Ryan

+0

私は助けることができてうれしい! –

答えて

4

質問以下のコメントを要約:

q.getSingleResult().getClass().getInterfaces()リターンを何インターフェース?


それはタイプjava.sql.Cloborg.hibernate.engine.jdbc.WrappedClob、およびjava.io.Serializableです。 [...]私は偶数列がCLOBだった実現しなかったと私はEclipseLinkのが私のために文字列への変換をしていた驚い

はEclipseLinkのように見える


は(CLOBを変換するために十分にスマートであります実際には、 Stringと同じように、非常に長い文字列です)〜 Stringが必要です。 Hibernateでは、これを明示的に行う必要があります。私はこれがJPA仕様に準拠していると思います。

0

hibernate用の正しいデータベース方言を設定しましたか?方言は、スカラー値の型をマッピングするために使用されます。

+0

私はOracleデータベースを使用しています。アプリケーションサーバーのDataSourceで設定しています。 Hibernateがログを初期化するときには、dialect:org.hibernate.dialect.Oracle10gDialectを使用してレポートを作成します。 – Ryan

関連する問題