主要是谈怎么拼装 转换结果 其中涉及的主要是怎么理解 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 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的...
配合`@SqlResultSetMapping`定义结果集映射,可以方便地处理查询结果。 4. **使用`Session.createNativeQuery()`** 此方法与`Session.createSQLQuery()`类似,但可以从实体类或`@NamedQuery`中加载预定义的SQL。...
在使用原生SQL时,需要注意的是,你需要自己处理结果的映射和事务管理,这可能比使用HQL(Hibernate查询语言)更加复杂。 总结,Hibernate提供了丰富的函数支持,使得我们在处理数据时更加便捷。同时,子查询功能...
此外,如果查询结果需要映射到多个实体类,或者返回复杂的结果集,那么处理起来可能会比较麻烦,需要手动进行结果集的封装。 在提供的压缩包文件"NativeSQLTest"中,可能包含了作者对使用Hibernate进行Native SQL...
原生SQL查询可以返回结果集、单个值或自定义的结果类型。但需要注意的是,这种方式可能会丢失一些Hibernate的自动转换和事务管理功能。 总结,Hibernate提供了多种查询方式以适应不同场景的需求。HQL适用于大多数...
Hibernate的本地SQL查询功能为我们提供了一种灵活的方式来执行复杂的数据库操作,同时通过`addEntity()`、`addScalar()`和`Transformers.aliasToBean()`等方法,我们可以方便地将查询结果封装成Java对象,从而简化...
描述中提到"自己封装了原生sql的处理,模仿mybatis使用",这意味着开发者在项目中创建了一个类似MyBatis的简单SQL解析器。MyBatis是一个轻量级的持久层框架,它允许开发者编写原生的SQL语句并将其与Java代码绑定。...
使用本地sql语句查询后,无需再使用Object对查询结果进行强制转换,而是直接将查询结果放到实体Bean里了。 PS: 其实只有一版,这里只所以叫最终版是因为该附件我上传了好几天传不上去,到最后报告说‘资源已经存在...
- 结果集转换:`addEntity()`方法用于指定查询结果应被映射到哪个实体类,`list()`或`scroll()`方法执行查询并返回结果集,这些结果集将自动封装为对应的Java对象。 5. 示例: 假设我们有一个`User`实体类,对应...
总结,Hibernate的SQLQuery接口提供了对原生SQL查询的强大支持,我们可以方便地设置查询参数、处理查询结果,甚至自定义结果集的转换方式。通过灵活运用这些功能,开发者可以在保持ORM优势的同时,处理那些不适合HQL...
### Hibernate中使用SQL而非HQL语句的知识点详解 在Java开发中,Hibernate作为一个...通过以上分析可以看出,在Hibernate中使用原生SQL能够更灵活地处理复杂的数据库查询需求,同时也需要注意安全性和性能方面的考量。
在某些情况下,开发者可能需要使用原生SQL查询来执行特定的数据库操作,这时就可以利用Hibernate的SQLQuery功能。本文将详细讲解如何使用Hibernate的SQLQuery进行本地SQL查询。 首先,创建SQLQuery实例是通过...
如果查询结果包含多个字段,并且希望将这些字段封装成一个对象,则可以使用Hibernate的投影列表功能,或者手动创建一个新的类来存储查询结果。 ### 总结 本文主要介绍了Hibernate中的连表查询方法及其在实际开发中...
这个方法接收一个SQL字符串,通过Session获取数据库连接,创建PreparedStatement,执行查询,处理结果集,将其转换为ArrayList并返回。注意,这种方法需要手动处理列名和数据的映射。 ```java public ArrayList ...
在Hibernate中执行原生SQL查询时,可以通过`addScalar`方法指定返回值的类型,从而改变Hibernate对char类型字段的处理方式。具体操作如下: ```java Session session = this.getSession(); SQLQuery query = ...
然而,虽然这种方式简单易用,但当处理大数据集时,可能会遇到性能问题,因为Hibernate会加载所有满足条件的结果到内存中,然后再返回指定范围的结果。为了解决这个问题,我们可以利用JDBC的SQL分页来直接在数据库...
总结来说,Hibernate的SQLQuery接口提供了丰富的功能,支持本地SQL查询,处理字段冲突,加载关联对象,返回标量值或混合结果,以及利用结果集映射和命名SQL查询来提高代码的可读性和复用性。在实际开发中,灵活运用...
由于Hibernate支持SQL Server 2005,因此我们可以通过HQL(Hibernate Query Language)或者原生SQL来实现分页查询。 **4. 分页实现** 在本项目中,分页通常包含以下步骤: - **计算总记录数**:使用Hibernate的...
它不仅处理SQL的生成,还支持第二级缓存和查询语言(HQL),使得数据库操作更加面向对象。为了显示查询SQL,Hibernate 提供了`hibernatetool`,可以生成SQL脚本,或者通过配置`logging.level.org.hibernate.SQL`来打印...
**Hibernate原生通用DAO**是基于Hibernate框架设计的一种简化数据访问操作的方式,它模仿了Spring框架中的`HibernateTemplate`类,旨在提供一个简单易用的DAO(Data Access Object)层,方便开发人员进行数据库操作...