Невозможно привести список результатов HibernateQuery в класс Object

Я использую следующий запрос для извлечения данных из базы данных в спящем режиме

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query q = session.createSQLQuery("select name,addr1,addr2,postal_code,country,email," +
                "tel1,tel2,HeadOffice_id,Subscription_id from Restaurant " +
                "where id=" +id);
session.getTransaction().commit();
Restaurant rest = (Restaurant)result.get(0);

Но это возвращение исключения

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.hibernate.model.Restaurant

Я также попробовал этот путь, а также не уверен, что делает

AnnotationConfiguration config = new AnnotationConfiguration();  
config.addAnnotatedClass(Restaurant.class);  
SessionFactory factory= config.configure().buildSessionFactory();  
Session session =factory.getCurrentSession();
session.beginTransaction();
Query q = session.createSQLQuery("select name,addr1,addr2,postal_code,country,email," +
                    "tel1,tel2,HeadOffice_id,Subscription_id from Restaurant " +
                    "where id=" +id);
java.util.List<Restaurant> result = (List<Restaurant>)q.list();
session.getTransaction().commit();
Restaurant rest = (Restaurant)result.get(0);

Я снова получаю то же исключение. Как я могу сделать это с Hibernate?

Спасибо

2 ответа

Решение

Ваш запрос не возвращает экземпляры объекта Restaurant. Возвращает отдельные поля от этой сущности. Результатом такого запроса является List<Object[]>каждый Object[] содержащий все выбранные поля.

См. http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/:

Запросы могут возвращать несколько объектов и / или свойств в виде массива типа Object[]:

Если вы хотите, чтобы ваш запрос возвращал экземпляры ресторана, он должен быть

select r from Restaurant r where id = :id

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

Так просто как:

Restaurant rest = (Restaurant)session.get(Restaurant.class, id);
Другие вопросы по тегам