0

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

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 回答