赞
踩
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.alibaba.domain.Person解决方法:
- public Person queryById(Integer personId) {
- return (Person) getSession().createSQLQuery(" select * from person_inf where personId=:personId order by age desc LIMIT 0,1 ")
- .setParameter("personId", personId).uniqueResult();
- /*List<Person> list = getSession().createQuery(" from " + this.clazz.getName() + " where personId=:personId order by age desc LIMIT 0,1")
- .setParameter("personId", personId)
- .list();
- if (list.size() > 0) {
- return list.get(0);
- }
- return null;*/
- }
这样就会报上面的异常,正确做法是采用下面被注释的代码。
相关知识点:
1、sql与hql的区别
(1)sql操作的是数据库表,而hql操作的是对象;
(2)sql中“select * from table”,而hql中" from table对象"‘
因为sql用惯了,习惯*,但是hql不认识!
2、hibernate中createQuery与createSQLQuery的区别
(1)createQuery(hql):用的hql语句进行查询,以hibernate生成的Bean为对象装入list返回
Query query = getSession().createQuery(hql);
(2)createSQLQuery(sql):用sql语句查询,以对象数组进行存储
- Query query = getSession().createSQLQuery(sql);
- query.setFirstResult((page - 1) * pageSize); //使当前记录滚动到指定记录 query.setMaxResults(pageSize);
- for (int i = 0; i < paramNames.length; i++) {
- query.setParameter(paramNames[i], paramValues[i], paramTypes[i]);
- }
- List list = query.list();
(3)使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回:addEntity
- Query query = getSession().createSQLQuery(sql).addEntity(returnAlias, returnClass);
- List list = query.list();
3、Hibernate除了支持HQL查询外,还支持原生SQL查询
对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。该接口是Query接口的子接口。
执行SQL查询步骤如下:
(1)获取Hibernate Session对象
(2)编写SQL语句
(3)通过Session的createSQLQuery方法创建查询对象
(4)调用SQLQuery对象的addScalar()或addEntity()方法将选出的结果与标量值或实体进行关联,分别用于进行标量查询或实体查询
(5)如果SQL语句包含参数,调用Query的setXxxx方法为参数赋值
(6)调用Query的list方法返回查询的结果集
1)标量查询
session.createSQLQuery("select * from person_inf").list();
它们都将返回一个Object数组组成的List,数组每个元素都是person_inf表的一个字段值。Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型。
但是在JDBC中过多的使用ResultSetMetadata会降低程序的性能。所以为了过多的避免使用ResultSetMetadata或者为了指定更加明确的返回值类型,我们可以使用addScalar()方法:
- session.createSQLQuery("select * from person_inf") .addScalar("name",StandardBasicTypes.STRING)
- .addScalar("age",StandardBasicTypes.INT)
- .list();
2)实体查询
addEntity()方法可以将查询结果转换为实体。
1、查询返回的是某个数据表的全部数据列
2、该数据表有对应的持久化类映射
session.createSQLQuery("select * from perons_inf").addEntity(Person.class).list;
上面的都是单表查询,如果我们在SQL语句中使用了多表连接,则SQL语句可以选出多个数据表的数据。Hibernate支持将查询结果转换成多个实体。如果要将查询结果转换成多个实体,则SQL字符串中应该为不同数据表指定不同别名,并且调用addEntity()方法将不同数据表转换成不同实体。
- String sql = "select p.*,e.* from person_inf as p inner join event_inf as e on p.person_id=e.person_id";
-
- List list = session.createSQLQuery(sql)
- .addEntity("p",Person.class)
- .addEntity("e", MyEvent.class)
- .list();
- List cats = sess.createSQLQuery("select {cat.*} from cats cat ")
- .addEntity("cat" , Cat.class).list();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。