[Ljava.lang.Object;无法施展

时间:2013-12-10 05:12:46

标签: java hibernate hql

我想从数据库中获取价值,在我的情况下,我使用List从数据库中获取值但我收到此错误

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to id.co.bni.switcherservice.model.SwitcherServiceSource
at id.co.bni.switcherservice.controller.SwitcherServiceController.LoadData(SwitcherServiceController.java:48)
at id.co.bni.switcherservice.controller.SwitcherServiceController.main(SwitcherServiceController.java:62)

这是我的代码

    Query LoadSource = session_source.createQuery("select CLIENT,SERVICE,SERVICE_TYPE,PROVIDER_CODE,COUNT(*) FROM SwitcherServiceSource" +
            " where TIMESTAMP between :awal and :akhir" +
            " and PROVIDER_CODE is not null group by CLIENT,SERVICE,SERVICE_TYPE,PROVIDER_CODE order by CLIENT,SERVICE,SERVICE_TYPE,PROVIDER_CODE");
    LoadSource.setParameter("awal", fromDate);
    LoadSource.setParameter("akhir", toDate);

    List<SwitcherServiceSource> result_source = (List<SwitcherServiceSource>) LoadSource.list();
    for(SwitcherServiceSource tes : result_source){
        System.out.println(tes.getSERVICE());
    }

任何帮助都会很愉快:)

@raffian,你的意思是这样吗??

List<Switcher> result = (List<Switcher>) LoadSource.list();
for(Switcher tes : result){
    System.out.println(tes.getSERVICE());
}

5 个答案:

答案 0 :(得分:38)

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to id.co.bni.switcherservice.model.SwitcherServiceSource

问题是

(List<SwitcherServiceSource>) LoadSource.list();

这将返回对象数组(Object [])的List,其中包含SwitcherServiceSource表中每列的标量值。 Hibernate将使用ResultSetMetadata来推断返回的标量值的实际顺序和类型。

解决方案

List<Object> result = (List<Object>) LoadSource.list(); 
Iterator itr = result.iterator();
while(itr.hasNext()){
   Object[] obj = (Object[]) itr.next();
   //now you have one array of Object for each row
   String client = String.valueOf(obj[0]); // don't know the type of column CLIENT assuming String 
   Integer service = Integer.parseInt(String.valueOf(obj[1])); //SERVICE assumed as int
   //same way for all obj[2], obj[3], obj[4]
}

相关链接

答案 1 :(得分:4)

我遇到了这样的问题并且挖掘了材料的色调。所以,为了避免丑陋的迭代,你可以简单地调整你的hql:

您需要像这样构建查询

select entity from Entity as entity where ...

同样检查这种情况,它对我来说非常有用:

public List<User> findByRole(String role) {

    Query query = sessionFactory.getCurrentSession().createQuery("select user from User user join user.userRoles where role_name=:role_name");
    query.setString("role_name", role);
    @SuppressWarnings("unchecked")
    List<User> users = (List<User>) query.list();
    return users;
}

所以这里我们从查询中提取对象,而不是一堆字段。它看起来也更漂亮。

答案 2 :(得分:1)

您的查询执行将返回Object[]

列表
List result_source = LoadSource.list();
for(Object[] objA : result_source) {
    // read it all
}

答案 3 :(得分:1)

在调用.list()之前,您需要添加 query.addEntity(SwitcherServiceSource.class)

答案 4 :(得分:0)

如果整个实体都将被退回,则在spring JPA中使用更好的解决方案 @Query(value =“来自ID为:ids的实体”)

此返回实体类型而不是对象类型