2016-07-07 26 views
0

Ich versuche, einen eindeutigen Datensatz aus der Datenbank zu holen. dies ist mein Versuchjava.lang.ClassCastException: java.lang.String kann nicht in [Ljava.lang.Object; - Abrufen einer Abfrage von der Datenbank mit Hibernate

@SuppressWarnings("unchecked") 
    @Override 
    public List<Employee> getAllEmployees(String employeeName) { 
    String query = "SELECT DISTINCT e.name FROM Employees e WHERE e.name like '%"+ employeeName +"%'"; 
     List<Object[]> employeeObjects = hibernateUtil.fetchAll(query); 
     List<Employee> employees = new ArrayList<Employee>(); 
     for(Object[] employeeObject: employeeObjects) { 
      Employee employee = new Employee(); 
      long id = ((BigInteger) employeeObject[0]).longValue();   
      int age = (int) employeeObject[1]; 
      String name = (String) employeeObject[2]; 
      float salary = (float) employeeObject[3]; 
      employee.setId(id); 
      employee.setName(name); 
      employee.setAge(age); 
      employee.setSalary(salary); 
      employees.add(employee); 
     } 
     System.out.println(employees); 
     return employees; 
    } 

dies die Linie der Fehler

for(Object[] employeeObject: employeeObjects) { //line 65 

tritt Wenn ich versuche, für die Platte, die ich diesen Fehler zu suchen, was

java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.Object; 
    com.ranga.dao.impl.EmployeeDAOImpl.getAllEmployees(EmployeeDAOImpl.java:65) 
    com.ranga.service.impl.EmployeeServiceImpl.getAllEmployees(EmployeeServiceImpl.java:48) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:497) 
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    com.sun.proxy.$Proxy23.getAllEmployees(Unknown Source) 
    com.ranga.controller.EmployeeController.searchEmployee(EmployeeController.java:73) 

bitte falsch sein könnte?

+0

Ich hoffe, [Little Bobby Tables] (https://xkcd.com/327/) funktioniert nicht für Sie. –

+0

Keine Ahnung, was 'hibernateUtil.fetchAll' tut - Ihr Problem ist wahrscheinlich dort. –

+0

Was ist die Linie, die die Ausnahme verursacht? – Stultuske

Antwort

4

Ihre Anfrage ist:

SELECT DISTINCT e.name FROM Employees e WHERE e.name like '%"+ employeeName +"%' 

(Was nicht parametriert ist schlecht sehr schlecht Frech Entwickler...!)

Daher Sie einzigartige e.name von Employees wählen - dies bedeutet, dass Sie wieder einige bekommen Namen.

Daher würde ich vermuten, hibernateUtil.fetchAll gibt eine List<String> zurück.

Sie tun:

List<Object[]> employeeObjects = hibernateUtil.fetchAll(query); 

Was ich vermute, sind eine unsichere Besetzung von List<?> oder List (roh).

Sie tun dann

for(Object[] employeeObject: employeeObjects) { 
... 
} 

An diesem Punkt Java wird das Element in der List auf den gewünschten Typ umgewandelt, das heißt Object[]. Daher dein Fehler.