2015-06-02 4 views
1

Я следующий фрагмент кода, когда я исполняю, я получаюClassCastException даже после предоставления литья класса

java.lang.ClassCastException: [Ljava.lang.Object; не может быть приведен к test.hr.Employee

Код:

Query query = 
      getEntityManager().createNamedQuery("Employee.findEmployees"); 
     List<Employee> result = query.getResultList(); 
     if (result != null) { 
      for (int i = 0; i < result.size(); i++) { 
       Employee emp = (Employee) result.get(i); 
       log.info("Employee =" +emp.getNumber()); 
      } 

JPQL:

select DISTINCT u.projectId,e.empNumber from Employee e LEFT JOIN 
e.userProjectsList u JOIN u.projectMaster pm 
where e.userNumber='SMITH' 

Как я могу избавиться от этого исключения?

+2

и что такое запрос JPQL? –

+1

причина в том, что [Ljava.lang.Object; это имя для Object [], представляющее массив объекта. где вы выполняете команду Employee. –

+0

@NeilStockton Я включил свой JPQL в свой вопрос. – user75ponic

ответ

1

На самом деле ваш запрос не возвращает Employee но Вместо этого массив объектов (массив объектов, содержащий идентификатор проекта и идентификатор сотрудника), поэтому у вас есть два варианта:

1- Изменить JPQL запрос, как это:

SELECT e from Employee e 

2- Или изменить свой код для чтения из объекта:

Query query = 
     getEntityManager().createNamedQuery("Employee.findEmployees"); 
    List<Object[]> result = query.getResultList(); 
    if (result != null) { 
     for (int i = 0; i < result.size(); i++) { 
      Object[] emp = (Object[]) result.get(i); 
      log.info("Employee =" +emp[0]); 
     } 

EDIT:

И ссылаясь на свое редактирование, вам необходимо:

 for (int i = 0; i < result.size(); i++) { 
      Object[] emp = (Object[]) result.get(i); 
      log.info("Employee Number=" +emp[1]); 
     } 
+0

Спасибо, что помогло решить мою проблему. Оценил. – user75ponic

+0

Каков наилучший подход для присвоения Object [] значениям класса Java POJO или что-то подобное этому? – user75ponic

+0

Ну, вы можете просто перебрать этот массив объектов и создать новый Employee в каждой итерации 'Employee Empl = new Employee();' и установить его номер с помощью 'Empl.setNumber (emp [0]);' если вы уже определили getter и setter для Number. –

1

проблема заключается в

Employee emp = (Employee) result.get(i); 

попробовать этот

Object[] emp = (Object[]) result.get(i); 

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

+0

Это может сработать, но это не помогает понять, почему OP не может бросить Employee. Объясните, как 'Object [] emp' можно использовать для получения экземпляра' Employee'. –

+0

оба являются разными типами, как они могут конвертировать Object [] в Employee, даже если у них нет отношения между подобным наследованием? –

+0

Да, вы говорите прав. Но это не помогает ответить на вопрос. Сделайте несколько выводов, сделайте некоторые выводы, помогите OP решить проблему. –

Смежные вопросы