从双返回单个字符中选择“字符串”

时间:2013-01-07 15:59:35

标签: oracle hibernate groovy

我有一个非常简单的Groovy类,我只是尝试通过Hibernate 3.3.2 GA使用本机SQL查询从Oracle 11g数据库中选择一个String。它似乎很简单,但我无法理解我得到的结果。这是代码:

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'字符串?

1 个答案:

答案 0 :(得分:1)

当我输入这个问题时,我想出了答案。似乎Hibernate将结果解释为字符而不是String,因此只返回'H'。

我发现修复此问题的方法是在select语句中添加列别名,然后使用addScalar(String columnAlias, Type type) 指定结果应解释为String。

同样,我使用了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!]]