`
have_life
  • 浏览: 147273 次
社区版块
存档分类
最新评论

hibernate 原生sql查询的结果集处理

    博客分类:
  • java
 
阅读更多
主要是谈怎么拼装 转换结果   其中涉及的主要是怎么理解 Object[]  ojbArr
这个是Object[] 是说结果集的每一列 是一个 Object数组。而不是说所有的结果集整个是个Object数组。


直接看我的代码例子吧,好理解些。


@Transactional(propagation=Propagation.REQUIRED, readOnly=false)
	public List<DomainTagRank> getDomainTagRank(String domain){
		String sql = "select tag_name, count(*) from bookmark b, bookmark_tag_relation r, tag t where  b.domain = ? and b.id = r.bookmark_id and t.id = r.tag_id  GROUP BY t.tag_name ORDER BY count(*) desc";
        SQLQuery sqlQuery = this.getSession().createSQLQuery(sql);
        sqlQuery.setParameter(0, domain);
        List list = sqlQuery.list();
        
        List<DomainTagRank> resList = new ArrayList<DomainTagRank>();
        for (int i=0; i<list.size();  i++){
        	Object[] objArr = (Object[])list.get(i);
        	DomainTagRank domainTagRank = new DomainTagRank();
        	domainTagRank.setDomain(domain);
        	domainTagRank.setTagName(objArr[0].toString());
        	domainTagRank.setCount(Integer.parseInt(objArr[1].toString()));
        	domainTagRank.setRank(i+1);
        	domainTagRank.setUserCount(getUserCountOfOneDomainTag(domain, domainTagRank.getTagName()));
        	resList.add(domainTagRank);
        }
        return resList;
	}





下面是别的地方的文字说明,反正也可以看下,便于理解整个到底怎么回事。

原文章地址:http://langgufu.iteye.com/blog/1565397

使用hibernate3的createSQLQuery遇到的问题
为了给访问加速,把DAO中的一些HQL的操作改成了SQL,其实最主要的原因是:操作的是多张表,返回的数据也来源于多个表的字段;
String sql = “select A.id ID, A.name NAME, B.salary SALARY from employee A , Salary B where.......”;
Query query =getSession().createSQLQuery(sql)
.setResultTransformer(Transformers.aliasToBean(ReturnEmployee.class));
由于返回的ID, NAME, SALARY 非一个和表对应的一个BEAN,所以自己需要建立一个ReturnEmployee的BEAN,属性包括ID, NAME, SALARY;在mysql下调试,成功。
但是在ORACLE环境下却报错:

org.hibernate.PropertyNotFoundException: Could not find setter for ID on class com.ReturnEmployee

经过几个小时的查错,调试,没有发现问题的所在,只能摆脱GOOGLE了,最后在国外的一个论坛上找到了答案:

this is actually a limitation of some databases which return alias all uppercase instead of using the casing you actually specified.

until then use .addScalar(..) to workaround it.

原来是Hibernate对ORALCE的支持有BUG,所以修改代码为:
Query query = getSession().createSQLQuery(sql).addScalar("ID")
.addScalar("NAME").addScalar("SALARY");
就可以了,需要注意的是
List employeeData = query.list();
返回的employeeData 中的数据是object[],这样取值:
List employeeBean = new ArrayList();
for (int i = 0; i < employeeData.size(); i++) {
Employee employee = new Employee();//把"裸"数据组装到自己的employee类

Object[] object = (Object[]) employeeData.get(i);
employee.setId(object[0].toString());
employee.setName(object[1].toString());
employee.setOrgType(object[2].toString());

employeeBean.add(employee);
}
分享到:
评论

相关推荐

    Hibernate 函数 ,子查询 和原生SQL查询

    Hibernate 函数 ,子查询 和原生SQL查询。Hibernate 函数 ,子查询 和原生SQL查询

    hibernate执行原生sql语句

    hibernate执行原生sql语句

    hibernate 执行原生sql的几种方式

    NULL 博文链接:https://ynp.iteye.com/blog/2007053

    Hibernate中的查询:HQL、Criteria、原生SQl

    Hibernate中的查询:HQL、Criteria、原生SQl的Demo,希望可以帮助大家理解Hibernate查询。

    Hibernate之原生Native SQL查询

    该方式是原生SQL查询的一种方式,需要个人自己书写SQL语句进行操作,用法比较灵活多变,适合比较复杂的SQL查询.该压缩包是本人对该查询方式的一种总结练习

    spring+hibernate,自己封装了原生sql的处理,模仿mybatis使用

    集成spring,hibernate,并且自写了一个sql的解析器,只有controller和service层,非常方便

    Hibernate SQLQuery执行原生SQL.docx

    Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的。通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类——SQLQueryImpl对象...

    springmvc+hibernate(连接sql)的增删改

    spring4+hibernate4.3.5,连接sql,使用springMVC框架,完整可运行的程序,看李守宏的视屏,有些做了修改,比如spring版本,用JTDS连接,新手可参考做

    关于Hibernate分页类和jdbc的sql分页完美融合

    NULL 博文链接:https://jeffenchung.iteye.com/blog/1472402

    Jpa 原生SQL分页查询“一个别名引发的一场血案”

    问题描述: 备注:刚开始SQL 没有加任何AS 别名 第一页:正常显示   第二页:显示不正常   为什么第一页可以第二页不行,一模一样的SQL没有修改过? 百度查了一下,没什么资料、无法下手。。。 看了日志发现第...

    springboot利用jpa连接hibernate用法2

    springboot利用jpa连接hibernate,并进行生成表,对表的增加,删除,查询操作用法2

    详解Java的Hibernate框架中的缓存与原生SQL语句的使用

    主要介绍了Java的Hibernate框架中的缓存与原生SQL语句的使用,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下

    SQL查询构建工具Querydsl.zip

    Querydsl是一个Java开源框架用于构建类型安全的SQL查询语句。它采用API代替拼凑字符串来构造查询语句。可跟 Hibernate 和 JPA 等框架结合使用。 基本查询: JPAQuery query = new JPAQuery(entityManager); ...

    HIBERNATE_QUERY

    Hibernate支持强大且易于使用的面向对象查询语言(HQL)。 如果希望通过编程的方式创建查询,Hibernate... 你也可以用原生SQL(native SQL)描述Hibernate查询,Hibernate额外提供了将结果集(result set)转化为对象的支持。

    Hibernate实战(第2版 中文高清版)

     15.2.1 自动的结果集处理   15.2.2 获取标量值   15.2.3 Java Persistence中的原生SQL   15.3 过滤集合   15.4 高速缓存查询结果   15.4.1 启用查询结果高速缓存   15.4.2 理解查询高速缓存   ...

    spring-ibatis-ext-plugin.1.0.0 扩展ibaits原生SQL

    在多数情况下不及特定数据库支持的物理分页,而hibernate的分页则是直接组装sql,充分利用了特定数据库的分页机制,效率相 对较高。本文讲述的就是如何在不重新编译ibatis源码的前提下,为ibatis引入hibernate式的...

    Hibernate+中文文档

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    hibernate3.2中文文档(chm格式)

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    HibernateAPI中文版.chm

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    hibernate中文参考文档

    1、在Tomcat中快速上手 2、体系结构 3、SessionFactory配置 4、持久化类 ...13、原生SQL查询 14、性能提升 15、工具箱指南 16、示例:父子关系 17、示例:Weblog应用程序 18、示例:不同的映射 19、最佳实践

Global site tag (gtag.js) - Google Analytics