2015-01-19 1 views
0
protected List query(String condition) { 

    String queryString = "FROM Worker"; 
    System.out.println("adding to query"); 
    if (condition != null) { 
     queryString += " " + condition; 
     System.out.println(condition); 
    } 
    System.out.println("added to query"); 
    Query query = em().createQuery(queryString); 
    System.out.println("created query"); 

    System.out.println("starting query"); 
    List <Radnik> c = query.getResultList(); 

    System.out.println(c.size()); 

    List <WorkerBean> result = new ArrayList <WorkerBean>(); 
    System.out.println("before for"); 
    if (c instanceof List <? >) { 
     System.out.println("YES!"); 
     for (Object obj: c) { 
      System.out.println("entered!!!"); 
      System.out.println(c.get(0).getClass()); 
      if (obj instanceof Worker) { 
       System.out.println("it's a worker"); 
      } 
      Workerentity = (Worker) obj; 
      result.add(EntityToBean(entity)); 
     } 
     c.clear(); 
     System.out.println("out of for"); 

    } 

    return result; 
} 

Так что вещь, которая меня и все остальные в офисе подслушивания является то, что при первом вызове этого запроса он проходит без проблем (полный список работников), но когда я позвонил во второй раз (с некоторыми параметрами), что говорит о том, что размер списка, как я ожидал, но бросаетJava отбрасывать исключение продолжает случайным образом появляться (первый он может использовать, после того, как оно наклоненное)

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to. 

так, чтобы подвести итог не может бросить на во второй раз (@ System.out.println (c.get (0) .getClass());

+2

Нет необходимости в 'if (c instanceof List ) {', поскольку это обеспечивается API. –

+2

вместо 'System.out.println (c.get (0) .getClass());' вы не хотели печатать 'System.out.println (o.getClass());'. Я уверен, что при втором вызове данные (список) не будут одинаковыми. –

+2

Как рабочий связан с Радником? –

ответ

0

Таинственный ClassCastExceptions имеет тенденцию возникать, когда вы игнорируете предупреждения компилятора, связанные с дженериками. Включите все предупреждения компилятора и убедитесь, что вы обращаетесь к ним. В частности, не используйте необработанные типы (например, List без общего типа) и не вызывайте методы, которые используют или возвращают необработанные типы.

При использовании дженериков должным образом, ваш метод может сократить до этого:

protected List<WorkerBean> query(String condition) { 

    String queryString = "FROM Worker"; 
    System.out.println("adding to query"); 
    if (condition != null) { 
     queryString += " " + condition; 
     System.out.println(condition); 
    } 
    System.out.println("added to query"); 

    TypedQuery<Radnik> query = em().createQuery(queryString, Radnik.class); 
    System.out.println("created query"); 

    System.out.println("starting query"); 
    List <Radnik> c = query.getResultList(); 

    System.out.println(c.size()); 

    List <WorkerBean> result = new ArrayList <WorkerBean>(); 
    for (Radnik obj: c) { 
     result.add(EntityToBean(obj)); 
    } 

    return result; 
} 

Обратите внимание на использование TypedQuery вместо запроса.

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

+0

Да, это похоже на достойный ответ, но проект, над которым я работаю, не работает так, чтобы для меня не было TypedQuery, но определенно правильный ответ ... –

0

Обращаем внимание на детали.

if (obj instanceof Worker) { 
    System.out.println("it's a worker"); 
} 

Workerentity = (Worker) obj; 

Попытка наложить объект на Работника происходит независимо от того, что объект является экземпляром Рабочего.

Переместите бросок внутри блока if.

+0

Хотя он печатает Это рабочий, даже если бросок внутри, если я выбрал исключение. –

+0

добавьте другое, чтобы напечатать, когда оно не является рабочим, и вы будете удивлены, обнаружив, что пытаетесь бросить нерабочего на работник. – DwB

0

Итак, после того, как вы пришли снова через день и перезапустили все пару раз (отчаянно я был). Сейчас все работает. Это не в первый раз, когда это случилось со мной (возможно, какой-то сборщик мусора и т. Д.) Спасибо за усилия ребята :)

+2

Не обвиняйте плохого GC ... –

+1

Простите, GC я был неправ, и я плохой человек! –

0

Итак, чтобы обновить, у меня был список объектов, потому что конкретно не указано, что я должен выбрать, а часть FROM имеет несколько таблиц! : dummy