做项目的时候遇到这样的问题,hibernate执行SQL语句返回来的list集合调试断点的时候检查list集合有值,但是返回action遍历的时候在list.get(i);这句话时报异常,调试结果是list集合为空,查找到的结果就是用SQL语句不能自动转换成bean对象,所以要转换成数组形式在进行遍历,这时返回的list集合里的值就可以遍历出来了.
偷个懒把别人的代码粘过来了,还有个错误没有写,有时间在总结吧:
Hibernate执行sql语句
Hibernate执行sql语句:
BasicServiceImpl basicServiceImpl = new BasicServiceImpl();
String hql = "select * from AccountInfo where selfId='0000100003' or(left(selfId,10)='0000100004' and
nodeSum=0)";
*写SQL语句的时候做好给表名起个别名
TManager tManager = TManagerImpl.getInstance();
List accountList = tManager.getSession().createSQLQuery(hql).list();
//List accountList = tManager.getSession().createSQLQuery(hql).addEntity(AccountInfo.class).list();
for(int i=0;i<accountList.size();i++){
Object[] objects = (Object[])accountList.get(i);
for(int j=0;j<objects.length;j++){
System.out.println(objects[j].getClass().getName());// 从这个输出结果可以看出,objects[j]的
值实际上是AccountInfo的属性(表的字段)而不是AccountInfo对象,
}
System.out.println(objects.length);
}
信息: java.lang.ClassCastException:Ljava.lang.Object; cannot be cast to net.yjiasoft.sss.table.AccountInfo
分析:原来是查询出来的字段并不能自动转换为bean对象,所以要添加addEntity(Clazz class)。
扩展:
1.SQL返回一个Map对象,也就是说在在list里包含多个Map,代码如下
Query query = session.createSQLQuery("select id,name from Tree t where pid in (select id from Tree) ").setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //返回一个map,KEY:为DB中名称一致(大小写一致)遍历list时就可以
Map map = (Map)list.get[i];
map.get("id");map.get("name");来取值。按你的SQL语句select后的字段名来作为map的Key,但这个key必须与数据库中的字段名一模一样。
2.可以用作函数方面的。如
Query query = session.createSQLQuery("select sum(id) SUMID from Tree t where pid in (select id from Tree)
.addScalar("SUMID",Hibernate.INTEGER) //转换类型,按DB中的type转
.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //返回一个map,KEY:为DB中名称一致(大小写一致)
直接就map.get("SUMID")可以取值了
还有一点就是这个方法在Hibernate3.2版本上才能正常运行。
3.hibernate 中createQuery与createSQLQuery两者区别是:
前者用的hql语句进行查询,后者可以用sql语句查询
前者以hibernate生成的Bean为对象装入list返回
后者则是以对象数组进行存储
所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便
突然发现createSQLQuery有这样一个方法可以直接转换对象
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
XXXXXXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。
呵呵以后多注意,还是时不时的要看看hibernate各个对象方法的使用。
还有另外一个相关的小细节应注意:
比如有这样一个po
PO: User.class
properties: userId,userName
DDL: create table tuser (userid varchar(10),username varchar(20));
当执行:
session.createQuery("from User u").list()时生成的SQL:
select userid,username from tuser;
当执行:
session.createQuery("from User u").iterator()时生成的SQL:
select userid from tuser;
可以看出list()一次将数据从数据库中读出直接填充到List中
iterator()将数据的主键从数据库中读出,当循环这个Iterator时才添加执行:
select userid,username from user where userid=?;把数据读出。
在不同的应用范围使用不同的方法,具体在hibernate应用中应当注意。
相关推荐
除了ORM框架,还可以使用存储过程或者ADO.NET的DataSet/DataTable等方式进行无SQL语句的数据库操作。存储过程是在数据库端预编译的SQL代码集合,可以在C#中调用,减少了网络传输和解析SQL的成本。ADO.NET虽然直接...
- **应用场景**:当需要执行特定于某个数据库的SQL语句时。 - **实现方法**: ```java Query query = session.createSQLQuery("SELECT * FROM customers WHERE name LIKE :name AND age = :age"); query....
在Java开发中,Bean对象常用于封装业务数据,而SQL语句则是数据库操作的核心。将Bean对象转换为SQL语句可以简化数据操作,提高代码的可读性和可维护性。本示例通过Annotation和反射技术来实现这一目标,旨在帮助...
在Java的Hibernate框架中,使用SQL语句是一个常见的需求,特别是在处理特定的数据库操作或优化查询性能时。Hibernate,作为SSH(Spring、Struts、Hibernate)三大Web开发框架之一,提供了一种优雅的方式将对象关系...
存储过程是预编译的SQL语句集合,存储在数据库服务器中,可以接受参数、返回结果并执行特定的数据库操作。它们提高了数据库性能,减少了网络流量,并提供了封装和重用的机制。 2. **为什么要在Hibernate中调用存储...
例如,保存一个对象到数据库只需调用`session.save(object)`,查询则可以用`session.createQuery(hql).list()`或`session.createCriteria(entityClass).list()`。 总的来说,这个"jdbc+hibernate"的jar包结合了低级...
通过Hibernate,开发者可以使用面向对象的方式来进行数据库操作,而无需直接编写SQL语句。 ### 二、Struts+Hibernate中LIST对象操作详解 #### 1. 单一属性查询与列表返回 在Struts+Hibernate的项目中,我们常常...
在Hibernate框架中,HQL(Hibernate Query Language)是用于操作对象关系映射的查询语言,类似于SQL,但它是面向对象的。本篇文章将详细介绍在Hibernate中进行投影查询的三种主要方式:直接查询、查询返回对象以及...
当需要遍历查询结果时,可以通过`createQuery()`方法执行HQL语句,然后调用`list()`获取结果列表: ```java Query query = session.createQuery("from Student"); List<Student> list = query.list(); for (Student ...
对于需要直接执行原生SQL语句的情况,Hibernate也提供了相应的支持。示例如下: ```java SQLQuery query = session.createSQLQuery("select * from customer"); List<Object[]> list = query.list(); for (Object[] ...
2. **二元条件标签**:如`<foreach>`,用于遍历集合或数组,并根据元素动态生成SQL语句。 动态SQL的使用让iBatis能够应对更多复杂的数据查询场景,提高了开发效率。 综上所述,iBatis作为一种轻量级的数据访问框架...
5. **执行查询并处理结果**:调用Criteria的list()方法执行查询,返回List集合,遍历集合处理查询结果。 6. **关闭Session和Transaction**:最后,别忘了关闭Session和提交事务。 #### 示例代码 ```java public ...
在查询结果处理方面,需要根据返回的结果来定义接收数据类型,例如,返回的结果是一个列表,可以使用 List<Object[]> 来接收,然后遍历列表,处理每个元素。 以下是 HQL 查询的示例代码: 首先,添加 ...
`list()`返回的是一个`List<Object[]>`,每个元素都是一个Object数组,可以使用`Arrays.toString((Object[])obj)`打印。 4. **查询多列数据并返回自定义实体类**: 可以通过`new`关键字创建新的实体实例,例如`...
- **优化SQL**:编写高效的SQL语句,避免全表扫描,确保SQL能快速定位所需数据。在JOIN操作中,将数据量大的表放在FROM子句的前面,利用索引来提高性能。 - **控制返回字段**:只查询必要的字段,减少不必要的数据...
在Java中,我们通常使用JDBC(Java Database Connectivity)来执行SQL语句。首先,需要建立数据库连接,然后创建Statement或PreparedStatement对象,编写SQL语句,并设置分页参数。例如,对于MySQL: ```java int ...
- **多表联合查询**:执行`from Student, Course`这样的语句,并不会简单地返回两个对象集合,而是返回两个集合的笛卡尔积,类似于SQL语句中的全外连接。在实际应用中,这种形式的语句很少使用。 ##### 2. 属性查询...
Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...
数据库的创建可以通过SQL语句直接在数据库管理工具中完成,以便于测试和验证分页功能。 **2. 创建Java Web项目** 使用NetBeans IDE 6.9创建一个新的Struts2+Hibernate项目,选择相应的框架模板。IDE会自动生成配置...