Hibernate Projection抛出ClassCastException

时间:2013-06-05 08:33:24

标签: hibernate criteria projection classcastexception hibernate-criteria

Hibernate 3x + Spring MVC 3x

PART-1

通用方法

// getAll
@SuppressWarnings("unchecked")
public <T> List<T> getAll(Class<T> entityClass) throws DataAccessException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(entityClass);
return criteria.list();
}

在控制器中获取列表

 List<GenCurrencyModel> currencyList=pt.getAll(GenCurrencyModel.class);

测试

System.out.println("Type: "+currencyList.get(0).getClass()); 
System.out.println("Value: "+((GenCurrencyModel)currencyList.get(0)).getId());

结果

Type: class com.soft.erp.gen.model.GenCurrencyModel
Value: 1

PART-2

更改通用方法[使用投影]

 @SuppressWarnings("unchecked")
public <T> List<T> getAll(Class<T> entityClass, String[] nameList) throws DataAccessException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(entityClass);

ProjectionList pl = Projections.projectionList();

for (int i=0; i<nameList.length; i++) {
    pl.add(Projections.property(nameList[i].toString()));   
}

criteria.setProjection(pl);

return criteria.list();
}

在控制器中获取列表

String []list={"id","isoCode"};
List<GenCurrencyModel> currencyList=pt.getAll(GenCurrencyModel.class,list);

测试

System.out.println("Type: "+currencyList.get(0).getClass()); 
System.out.println("Value: "+((GenCurrencyModel)currencyList.get(0)).getId());

结果[java.lang.ClassCastException]

nested exception is java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.soft.erp.gen.model.GenCurrencyModel]
  1. 为什么这个类会抛出异常,因为 criteria.setProjection(pl)返回条件,然后Criteria返回相同的列表。
  2. 如何动态控制这个?
  3. 更新我!

1 个答案:

答案 0 :(得分:0)

您正在设置投标以请求idisoCode,因此结果是Object数组的列表,其中id位于索引0和isoCode处指数1。

尝试将每个结果转换为Object[]并检查数组的内容。