[Ljava.lang.Object; нельзя отбрасывать

Я хочу получить значение из базы данных, в моем случае я использую 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());
}

Ответ 1

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

Проблема

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

Это вернет список массивов объектов (Object []) со скалярными значениями для каждого столбца таблицы 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]
}

Ссылки по теме

Ответ 2

Я столкнулся с такой проблемой и выкапывал материал. Итак, чтобы избежать уродливой итерации, вы можете просто настроить свой 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;
}

Итак, здесь мы извлекаем объект из запроса, а не кучу полей. Также он выглядит намного красивее.

Ответ 3

Выполнение запроса вернет список Object[].

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

Ответ 4

Вам нужно добавить query.addEntity(SwitcherServiceSource.class), прежде чем вызывать запрос .list().