2012-08-14 27 views
6

hibernate(3.2.1.GA)では、次の方法を使用してCLOB型データをOracle(10g)データベースに挿入します。CLOBデータ型をHibernateのStringに変換する方法は?

Hibernate.createClob(parameters.get("txtCatImage")); 

parametersすべての要求パラメータが記憶されているMapあります。 Clobのデータ型をデータベースから直接取得すると、entityObj.getCatImage()のようなものは機能しません。

thisthisが見つかりましたが、方法が見つかりませんでした。

以下は、Clobタイプのプロパティを使用するエンティティです。

public class Category implements java.io.Serializable { 

    private Long catId; // Primary key. 
    private Clob catImage; // CLOB type field. 
    // Other fields. 
    private static final long serialVersionUID = 1L; 

    public Category() {} 

    // Overloaded constructs + getters + setters + hashcode() + equals() + toString(). 
} 

データベース内Clobフィールドは、ちょうどこのような場合には、画像のファイル名を格納します。

+0

定義 '動作しないでしょう。'エラーが出ているのですか、それとも 'null 'を返していますか? – Dev

+0

@Dev - エラーは発生しません。それだけ。オブジェクト参照にこの 'org.hibernate.lob.SerializableClob @ 1e2ad75')' obj.getCatImage(いずれかを有するようなものを表示するのtoString() 'または' obj.getCatImage() 'の代わりにある実際の内容を示すのOracleデータベース内のイメージ・ファイル名。 SELECT * FROMカテゴリのようなOracleプロンプト上の実際のSQLは、Oracleターミナル上のアクタコンテンツを直接表示します。 – Tiny

答えて

9

どちらか希望Stringを取得したり、Clob.getAsciiStream()またはClob.getCharacterStream()を使用してのInputStreamまたはReaderとしてCLOBを読み取るために適切な引数でClob.getSubString(long, int)を呼び出します。

Clobがより少ない2147483647(別名Integer.MAX_VALUE)文字が含まれている場合は、これは

Clob clob = ... //Your clob 
String clobString = clob.getSubString(0, clob.length()); 
+6

'getSubString()':最初の文字は0ではなく、0ではありませんが、これはJavaDocによると – dzieciou

+1

です。初期バージョンでは位置が0から​​始まっている可能性があります。 length()はlongを返します。変換する必要があります)。 –

0

これは

new BufferedReader(new InputStreamReader(catImage.getAsciiStream())).readLine() 
2

のDev(上記参照)を使用する「のClobからソリューションを働くかもしれない行うことができます。 getSubString(long、int) "は大量のメモリを消費します。 私は次の解決策を好む。

private static String getAsString(Clob clob) { 
    Reader reader = null; 
    BufferedReader bufferedReader = null; 
    try { 
     reader = clob.getCharacterStream(); 
     bufferedReader = new BufferedReader(reader); 
     return IOUtils.toString(bufferedReader); 

    } catch (Exception e) { 
     throw new RuntimeException("Error while reading String from CLOB", e); 
    } finally { 
     IOUtils.closeQuietly(reader); 
     IOUtils.closeQuietly(bufferedReader); 
    } 
} 
関連する問題