解决:java.lang.ClassCastException:[Ljava.lang.Object

11 篇文章 0 订阅

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();

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值