Как избежать предупреждений о безопасности типов с результатами Hibernate HQL? - PullRequest
101 голосов
/ 22 сентября 2008

Например у меня такой запрос:

Query q = sess.createQuery("from Cat cat");
List cats = q.list();

Если я попытаюсь сделать что-то подобное, на экране появится предупреждение «Тип безопасности: для выражения типа Список требуется преобразование без проверки для соответствия списку»:

List<Cat> cats = q.list();

Есть ли способ избежать этого?

Ответы [ 16 ]

0 голосов
/ 17 сентября 2018
TypedQuery<EntityName> createQuery = entityManager.createQuery("from EntityName", EntityName.class);
List<EntityName> resultList = createQuery.getResultList();
0 голосов
/ 11 ноября 2015

Хорошее решение, позволяющее избежать предупреждений о безопасности типов с помощью запроса гибернации, - использовать инструмент, подобный TorpedoQuery , чтобы помочь вам создать безопасный тип HQL.

Cat cat = from(Cat.class);
org.torpedoquery.jpa.Query<Entity> select = select(cat);
List<Cat> cats = select.list(entityManager);
0 голосов
/ 16 июля 2014

Попробуйте это:

Query q = sess.createQuery("from Cat cat");
List<?> results = q.list();
for (Object obj : results) {
    Cat cat = (Cat) obj;
}
0 голосов
/ 02 апреля 2012

Я знаю, что это старше, но на сегодняшний день отметим 2 пункта в ответе Мэтта Перепела.

Точка 1

Это

List<Cat> cats = Collections.checkedList(Cat.class, q.list());

Должно быть это

List<Cat> cats = Collections.checkedList(q.list(), Cat.class);

Точка 2

Из этого

List list = q.list();

к этому

List<T> list = q.list();

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

0 голосов
/ 22 сентября 2008

Решение Джо Дина выглядит интересно, но считаете ли вы, что оно того стоит - создать новый список и перебрать все элементы, чтобы избавиться от предупреждений?

(извините, по какой-то причине не могу добавить комментарий к своему решению)

0 голосов
/ 22 сентября 2008

Если вы не хотите использовать @SuppressWarnings («unchecked»), вы можете сделать следующее.

   Query q = sess.createQuery("from Cat cat");
   List<?> results =(List<?>) q.list();
   List<Cat> cats = new ArrayList<Cat>();
   for(Object result:results) {
       Cat cat = (Cat) result;
       cats.add(cat);
    }

К вашему сведению - я создал метод util, который делает это для меня, чтобы он не засорял мой код и мне не пришлось использовать @SupressWarning.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...