0

Hibernate 3.3.2 GAを介してネイティブSQLクエリを使用して、Oracle 11gデータベースから文字列を選択しようとしている非常に単純なGroovyクラスがあります。とても単純に思えますが、得られた結果を理解することはできません。コードは次のとおりです。

package serialize

import org.hibernate.cfg.Configuration
import org.hibernate.transform.ToListResultTransformer

class SerializeDatabaseObjects {


    static main(args) {

        def sessionFactory = initHibernate()

        def session = sessionFactory.openSession()

        def tx
        def result

        try {
            tx = session.beginTransaction()

             result = session
                .createSQLQuery("""Select 'Hello World!' from dual""")
                .setResultTransformer(ToListResultTransformer.INSTANCE) 
                .list()

            tx.commit()
        }
        catch (Exception e) {
            if (tx!=null){ 
                tx.rollback() 
            }
            throw e
        }
        finally {
            session.close()
        }


        println result

        sessionFactory.close()
    }

    static initHibernate(){
        return new Configuration().configure().setProperty("hibernate.show_sql", "true").buildSessionFactory()
    }
}

出力:

Hibernate: Select 'Hello World!' from dual
[[H]]

ToListResultTransformer は、文字列全体を印刷するための私の最新の試みでした'Hello World!'が、IMO は必要ありません。しかし、何を試しても「H」が常に結果になります。

「Hello World」文字列全体を返すにはどうすればよいですか?

4

1 に答える 1

1

この質問を入力していると、答えがわかりました。Hibernate は結果を文字列ではなく文字として解釈しているため、'H' のみを返しているようです。

これを修正するために私が見つけた方法は、select ステートメントに列エイリアスを追加し、addScalar(String columnAlias, Type type)を使用して結果を文字列として解釈するように指定することです。

繰り返しますが、ResultTransformer( AliasToEntityMapResultTransformer ) を使用したため、結果には列名とその内容が含まれますが、厳密には必要ありません。

Hibernate が結果を文字列ではなく文字としてマッピングする理由を詳しく知りたい場合、または結果を強制的に文字列にする別の (より簡単な) 方法を提案したい場合は、コメントするか回答を投稿してください。

期待される結果を生成するコードは次のとおりです。

package serialize

import org.hibernate.cfg.Configuration
import org.hibernate.transform.AliasToEntityMapResultTransformer
import org.hibernate.type.StringType

class SerializeDatabaseObjects {


    static main(args) {

        def sessionFactory = initHibernate()

        def session = sessionFactory.openSession()

        def tx
        def result

        try {
            tx = session.beginTransaction()

             result = session
                .createSQLQuery("""Select 'Hello World!' as hello from dual""")
                .addScalar("hello", new StringType())
                .setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)
                .list()

            tx.commit()
        }
        catch (Exception e) {
            if (tx!=null){ 
                tx.rollback() 
            }
            throw e
        }
        finally {
            session.close()
        }


        println result

        sessionFactory.close()
    }

    static initHibernate(){
        return new Configuration().configure().setProperty("hibernate.show_sql", "true").buildSessionFactory()
    }
}

そして出力:

Hibernate: Select 'Hello World!' as hello from dual
[[hello:Hello World!]]
于 2013-01-07T15:59:34.857 に答える