当前位置:   article > 正文

解决:java.lang.ClassCastException:[Ljava.lang.Object_java.lang.classcastexception: [ljava.lang.object;

java.lang.classcastexception: [ljava.lang.object;

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.alibaba.domain.Person解决方法:

  1. public Person queryById(Integer personId) {
  2. return (Person) getSession().createSQLQuery(" select * from person_inf where personId=:personId order by age desc LIMIT 0,1 ")
  3. .setParameter("personId", personId).uniqueResult();
  4. /*List<Person> list = getSession().createQuery(" from " + this.clazz.getName() + " where personId=:personId order by age desc LIMIT 0,1")
  5. .setParameter("personId", personId)
  6. .list();
  7. if (list.size() > 0) {
  8. return list.get(0);
  9. }
  10. return null;*/
  11. }

这样就会报上面的异常,正确做法是采用下面被注释的代码。

 

相关知识点:

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语句查询,以对象数组进行存储

  1. Query query = getSession().createSQLQuery(sql);
  2. query.setFirstResult((page - 1) * pageSize); //使当前记录滚动到指定记录 query.setMaxResults(pageSize);
  3. for (int i = 0; i < paramNames.length; i++) {
  4. query.setParameter(paramNames[i], paramValues[i], paramTypes[i]);
  5. }
  6. List list = query.list();

(3)使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回:addEntity

  1. Query query = getSession().createSQLQuery(sql).addEntity(returnAlias, returnClass);
  2. 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()方法:

  1. session.createSQLQuery("select * from person_inf") .addScalar("name",StandardBasicTypes.STRING)
  2. .addScalar("age",StandardBasicTypes.INT)
  3. .list();

 

2)实体查询

addEntity()方法可以将查询结果转换为实体。

1、查询返回的是某个数据表的全部数据列

2、该数据表有对应的持久化类映射

session.createSQLQuery("select * from perons_inf").addEntity(Person.class).list;  

上面的都是单表查询,如果我们在SQL语句中使用了多表连接,则SQL语句可以选出多个数据表的数据。Hibernate支持将查询结果转换成多个实体。如果要将查询结果转换成多个实体,则SQL字符串中应该为不同数据表指定不同别名,并且调用addEntity()方法将不同数据表转换成不同实体。

  1. String sql = "select p.*,e.* from person_inf as p inner join event_inf as e on p.person_id=e.person_id";
  2. List list = session.createSQLQuery(sql)
  3. .addEntity("p",Person.class)
  4. .addEntity("e", MyEvent.class)
  5. .list();
  1. List cats = sess.createSQLQuery("select {cat.*} from cats cat ")
  2. .addEntity("cat" , Cat.class).list();

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/1011951
推荐阅读
相关标签
  

闽ICP备14008679号