在hibernate执行的SQL语句返回的list集合中的内容是Object[]对象,而不是entity对象

当Hibernate执行的SQL查询包含实体类中不存在于数据库表的字段时,返回的list集合内容会是Object[]而非实体对象,导致ClassCastException。解决方案是在DAO方法中使用`addEntity()`指定实体类进行强制转换,例如:`createSQLQuery(sql).addEntity(AccountInfo.class)`。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现状:在entity类中存在数据库表不存在的字段,这些字段只是做展示,不做在数据库表中进行保存。但是在sql语句查询的时候,出现了:返回的list集合中的内容是Object[]对象,而不是entity对象

代码:pojo代码:

    // 主键
	private String id;
	// 正确数量
	private Integer rightnum;
    // 酒吧id
	private String barid;
	// 场次id
	private String periodid;
	// 轮次状态
	private String periodstate;
	// 场次状态
	private String resultstate;
	// 时间设置
	private Integer time;
	// 分组内容id
	private Integer playguessid;
	// 游戏开始时间
	private Date startdate;
	// 游戏结束时间
	private Date enddate;
	// 显示内容
	private String content;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public Integer getRightnum() {
		return rightnum;
	}
	public void setRightnum(Integer rightnum) {
		this.rightnum = rightnum;
	}
	public String getBarid() {
		return barid;
	}
	public void setBarid(String barid) {
		this.barid = barid;
	}
	
	public Integer getTime() {
		return time;
	}
	public void setTime(Integer time) {
		this.time = time;
	}
	public Integer getPlayguessid() {
		return playguessid;
	}
	public void setPlayguessid(Integer playguessid) {
		this.playguessid = playguessid;
	}
	
	public Date getStartdate() {
		return startdate;
	}
	public void setStartdate(Date startdate) {
		this.startdate = startdate;
	}
	public Date getEnddate() {
		return enddate;
	}
	public void setEnddate(Date enddate) {
		this.enddate = enddate;
	}
	public String getPeriodstate() {
		return periodstate;
	}
	public void setPeriodstate(String periodstate) {
		this.periodstate = periodstate;
	}
	public String getResultstate() {
		return resultstate;
	}
	public void setResultstate(String resultstate) {
		this.resultstate = resultstate;
	}
	public String getPeriodid() {
		return periodid;
	}
	public void setPeriodid(String periodid) {
		this.periodid = periodid;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}

dao类:

String sql="select * from playguessresult  WHERE  barid=? and resultstate='2' and periodid=? order by startdate asc ";
	    return getCurrentSession().createSQLQuery(sql).setString(0, barid).setString(1, periodid).setFirstResult(0).setMaxResults(8).list();

数据库表创建语句:

CREATE TABLE `playguessresult` (
  `id` varchar(50) DEFAULT NULL COMMENT '主键',
  `rightnum` int(10) DEFAULT NULL COMMENT '正确数量',
  `barid` varchar(40) DEFAULT NULL COMMENT '酒吧id',
  `time` int(10) DEFAULT '120' COMMENT '时间设置',
  `playguessid` int(10) DEFAULT NULL COMMENT '分组内容id',
  `periodstate` varchar(10) DEFAULT NULL COMMENT '轮次状态',
  `startdate` datetime DEFAULT NULL COMMENT '游戏开始时间',
  `enddate` datetime DEFAULT NULL COMMENT '游戏结束时间',
  `resultstate` varchar(10) DEFAULT NULL COMMENT '场次状态',
  `periodid` varchar(50) DEFAULT NULL COMMENT '场次id'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

调用DAO的方法获取list集合,使用list.get(i)获取list集合中的对象时候,出现异常: java.lang.ClassCastException:Ljava.lang.Object; cannot be cast to net.yjiasoft.sss.table.AccountInfo

原因分析:

由于sql语句中字段信息是在entity中存在的,但是在entity类中存在有数据库表字段不存在的属性。那么在转化的时候不能自动的转化为bean对象,因此出现了在转为list集合对象,list存放的是Object[]对象。

解决方式:

在dao的方法中,使用addEntity(xx.class)来进行强制转化为bean对象,如:

getCurrentSession().createSQLQuery(sql).addEntity(AccountInfo.class).setString(0, barid).setString(1, periodid).setFirstResult(0).setMaxResults(8).list();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值