我有一个非常简单的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'字符串?
答案 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!]]