hibernate cannot be cast to [Ljava.lang.Object

问题是这样的 我用的是hibernate 框架做数据访问
因为用到spring security,我的用户实体类SysUser 实现了spring security的接口UserDetails
SysUser.java代码如下
[code="java"]
@Entity
@Table(name="sys_user")
@org.hibernate.annotations.Proxy(lazy = false)
public class SysUser implements java.io.Serializable ,UserDetails{

private Integer userId;

 private String uloginName;

 private String upassword;

//其他property及相关setter getter略

//实现UserDetails接口方法
@Override
@Transient
public Collection<? extends GrantedAuthority> getAuthorities() {
// TODO Auto-generated method stub
return null;
}

    @Override
    @Transient
    public String getPassword() {
        // TODO Auto-generated method stub
        return this.upassword;
    }


    @Override
    @Transient
    public String getUsername() {
        // TODO Auto-generated method stub
        return this.uloginName;
    }


    @Override
    @Transient
    public boolean isAccountNonExpired() {
        // TODO Auto-generated method stub
        return true;
    }


    @Override
    @Transient
    public boolean isAccountNonLocked() {
        // TODO Auto-generated method stub
        return true;
    }


    @Override
    @Transient
    public boolean isCredentialsNonExpired() {
        // TODO Auto-generated method stub
        return true;
    }


    @Override
    @Transient
    public boolean isEnabled() {
        // TODO Auto-generated method stub
        return this.ustatus==0?true:false;      
    }

[/code]
我的dao类 数据访问方法如下
SysUserDaoHbnImpl.java
[code="java"]
@Repository("sysUserDao")
public class SysUserDaoHbnImpl implements SysUserDao{
private static final Log log = LogFactory.getLog(SysUserDao.class);

private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}

@SuppressWarnings("unchecked")
@Cacheable(cacheName = "baseCache")
public List selectRecordForPage(QueryPara qp) {
// TODO Auto-generated method stub
//处理分页开始
List result=null;
try
{
Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria(qp.getClazz());
List list=qp.getCriterions();
if (list != null)

{

if(list.size()>0)
{
//Set keys = map.keySet();

for (Criterion cri : list)

{

criteria.add(cri);
}
}
}
// 获取根据条件分页查询的总行数
//System.out.println("获取根据条件分页查询的总行数");
int rowCount = ((Number) criteria.setProjection(

Projections.rowCount()).uniqueResult()).intValue();

criteria.setProjection(null);

qp.setRecordcount(rowCount);

            qp.setPagecount((qp.getRecordcount()+qp.getPagesize() - 1)/qp.getPagesize());
            if(qp.getPageNo()>qp.getPagecount())
            {                           
                qp.setPageNo(qp.getPagecount());
            }
            if(qp.getPageNo()<1)
            {
                qp.setPageNo(1);
            }                       
            List<Order> list2=qp.getOrders();
            if (list2 != null)   
            { 
                if(list2.size()>0)
                {
                     //Set<String> keys = map2.keySet();   
                    for (Order ord : list2)   
                    {   
                        criteria.addOrder(ord);//(Restrictions.like(key, map2.get(key)));   
                    }                               
                }
            }                       
            criteria.setFirstResult((qp.getPageNo() - 1) * qp.getPagesize());   
            criteria.setMaxResults(qp.getPagesize());                 
            result = (List<SysUser>)criteria.list();                     

     }
     catch (RuntimeException re)   
        {   
         log.error(re.getMessage());
        }                
     return result;
     //处理分页结束       
}

}
[/code]
服务层代码略,负责调用SysUserDaoHbnImpl.java的selectRecordForPage方法

我的控制器 负责调用服务层用户数据分页方法,然后服务层继续调用数据访问层SysUserDaoHbnImpl.java的selectRecordForPage方法
我的控制器UserController.java调用方法如下

[code="java"]
@RequestMapping(value={"/List"},method=RequestMethod.GET)
public String list(

@RequestParam(value="page", defaultValue="1") int page,
@RequestParam(value="perPage", defaultValue="30") int perPage,

ModelMap modelMap)
{

    QueryPara<SysUser> qp=new QueryPara<SysUser>();
    qp.setClazz(SysUser.class);     
    qp.setPagesize(perPage);
    qp.setPageNo(page);

    modelMap.put("userlist", this.sysUserService.selectRecordForPage(qp));
    modelMap.put("QueryPara", qp);      

    return "UserManager/List";
}

[/code]

我的视图userlist.jsp里面的java代码如下
[code="java"]
List list=(List)request.getAttribute("userlist");

if(list.size()>0)
{
Iterator it=list.iterator();

SysUser sysUser=null;

while(it.hasNext())
{

sysUser=(SysUser)it.next(); //此处抛出异常:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [SysUser]

}
[/code]

我运行系统,打开显示用户数据页面,SysUserDaoHbnImpl.java数据分页方法selectRecordForPage我设置断点都没有抛出异常,就在视图页面sysUser=(SysUser)it.next(); 这个地方抛出异常java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [SysUser]

请问高手 这是什么原因,应该如何修改呢,不胜感谢

附上我的测试情况:

(一)第一种情况,在原来系统里面SysUser.java没有实现UserDetails(spring security里面的一个接口)接口时,
用户数据显示视图userlist.jsp是显示正常的,可以看到用户数据

(问题是 现在SysUser.java实现接口UserDetails,怎么在视图层sysUser=(SysUser)it.next()就出问题? )

(二) 第二种情况,当我把SysUserDaoHbnImpl.java数据分页方法selectRecordForPage里面的下面代码部分做如下修改的时候 运行正常
[code="java"]
//注释下面代码
//int rowCount = ((Number) criteria.setProjection(

//Projections.rowCount()).uniqueResult()).intValue();

// criteria.setProjection(null);

//手动设置int rowCount值
int rowCount=1;//我用户表目前实际只有一个用户
[/code]

注释掉上面的Projections相关代码后,userlist.jsp页面也是运行正常的

jinnianshilongnian
jinnianshilongnian 附上我的猜想,是不是spring包裹后的session代理跟原生态的session产生差异? 这个不会
7 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问