Например, у меня есть такой запрос:
Query q = sess.createQuery("from Cat cat");
List cats = q.list();
Если я попытаюсь сделать что-то вроде этого, появится следующее предупреждение
Type safety: The expression of type List needs unchecked conversion to conform to List<Cat>
List<Cat> cats = q.list();
Есть ли способ избежать этого?
sess.createQuery("from Cat cat", Cat.class);
как упомянул Элазар.Ответы:
Использование
@SuppressWarnings
повсюду, как предлагается, - хороший способ сделать это, хотя для этого нужно набирать текст пальцем каждый раз, когда вы звонитеq.list()
.Я бы предложил два других метода:
Напишите каст-помощника
Просто выполните рефакторинг
@SuppressWarnings
в одном месте:Предотвратить создание предупреждений Eclipse о неизбежных проблемах
В Eclipse перейдите в Window> Preferences> Java> Compiler> Errors / Warnings и в разделе Generic type установите флажок
Ignore unavoidable generic type problems due to raw APIs
Это отключит ненужные предупреждения для подобных проблем, подобных описанной выше, которые неизбежны.
Некоторые комментарии:
Query
вместо результата,q.list()
потому что таким образом этот метод "обмана" можно использовать только для обмана с Hibernate, а не для обманаList
вообще..iterate()
т. Д.источник
Collections.checkedList()
метод не подавляет предупреждение о непроверенном назначении.Прошло много времени с тех пор, как этот вопрос был задан, но я надеюсь, что мой ответ может быть полезным для кого-то вроде меня.
Если вы посмотрите документацию javax.persistence api , вы увидите, что с тех пор туда были добавлены некоторые новые методы
Java Persistence 2.0
. Один из них - то,createQuery(String, Class<T>)
что возвращаетсяTypedQuery<T>
. Вы можете использовать такTypedQuery
же, как и раньше,Query
с той небольшой разницей, что все операции теперь безопасны по типу.Итак, просто измените свой код на что-то вроде этого:
И все готово.
источник
Мы
@SuppressWarnings("unchecked")
тоже используем, но чаще всего пытаемся использовать его только для объявления переменной, а не для метода в целом:источник
Попробуйте использовать
TypedQuery
вместоQuery
. Например вместо этого: -Использовать это:-
источник
Criteria
?В нашем коде мы аннотируем вызывающие методы:
@SuppressWarnings ("не отмечено")
Я знаю, что это похоже на взлом, но один из разработчиков недавно проверил и обнаружил, что это все, что мы могли сделать.
источник
Очевидно, что метод Query.list () в Hibernate API не является типобезопасным «по замыслу», и нет никаких планов его менять .
Я считаю, что самым простым решением, позволяющим избежать предупреждений компилятора, действительно является добавление @SuppressWarnings («не отмечено»). Эта аннотация может быть размещена на уровне метода или, если внутри метода, прямо перед объявлением переменной.
Если у вас есть метод, который инкапсулирует Query.list () и возвращает List (или Collection), вы также получаете предупреждение. Но этот подавляется с помощью @SuppressWarnings ("rawtypes").
Метод listAndCast (Query), предложенный Мэттом Куэллом, менее гибкий, чем Query.list (). Пока умею:
Если я попробую код ниже:
Я получаю ошибку компиляции: Несоответствие типов: невозможно преобразовать из списка в ArrayList
источник
Это не оплошность или ошибка. Предупреждение отражает реальную основную проблему - компилятор java никак не может быть уверен, что класс hibernate будет правильно выполнять свою работу и что возвращаемый им список будет содержать только кошек. Любое из предложений здесь в порядке.
источник
Нет, но вы можете выделить его в определенные методы запроса и подавить предупреждения с помощью
@SuppressWarnings("unchecked")
аннотации.источник
Новые версии Hibernate теперь поддерживают типобезопасный
Query<T>
объект, поэтому вам больше не нужно использовать@SuppressWarnings
или внедрять какие-либо хаки, чтобы убрать предупреждения компилятора. В API Session ,Session.createQuery
теперь будет возвращать тип безопасныйQuery<T>
объект. Вы можете использовать это так:Вы также можете использовать его, когда результат запроса не возвращает Cat:
Или при частичном выборе:
источник
У нас была такая же проблема. Но для нас это не имело большого значения, потому что нам нужно было решить другие более серьезные проблемы с помощью Hibernate Query и Session.
В частности:
Итак, у нас есть:
И наконец,
В AmplafiQuery есть «asList ()», который является универсальной версией Query.list (). В AmplafiQuery есть «unique ()», который является универсальной включенной версией Query.uniqueResult () (и просто регистрирует проблему, а не бросает исключение)
Это большая работа, чтобы просто избежать @SuppressWarnings. Однако, как я уже сказал (и перечислил), есть много других лучших! причины делать упаковочные работы.
источник
Я знаю, что это старше, но на сегодняшний день нужно отметить 2 пункта в ответе Мэтта Куэлла.
Пункт 1
это
Должно быть это
Пункт 2
Из этого
к этому
уменьшит количество других предупреждений, очевидно, в исходном теге ответа, маркеры были удалены браузером.
источник
Попробуй это:
источник
cat
экземпляром.Хорошее решение, чтобы избежать предупреждений о безопасности типов при запросе гибернации, является использование такого инструмента, как TorpedoQuery, который поможет вам создать безопасный тип hql.
источник
источник
Если вы не хотите использовать @SuppressWarnings («не отмечен»), вы можете сделать следующее.
К вашему сведению - я создал служебный метод, который делает это за меня, поэтому он не засоряет мой код, и мне не нужно использовать @SupressWarning.
источник