Как избежать, чтобы предупреждения безопасности типов с Были в спящем режиме результаты HQL?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

101
задан Dhaval Solanki 20 June 2019 в 07:20
поделиться

8 ответов

Используя @SuppressWarnings везде, как предложено, хороший способ сделать это, хотя это действительно включает немного пальца, вводящего каждый раз, когда Вы звоните q.list().

существует два других метода, которые я предложил бы:

Запись помощник броска

Просто осуществляют рефакторинг весь Ваш @SuppressWarnings в одно место:

List<Cat> cats = MyHibernateUtils.listAndCast(q);

...

public static <T> List<T> listAndCast(Query q) {
    @SuppressWarnings("unchecked")
    List list = q.list();
    return list;
}

Препятствуют тому, чтобы Eclipse генерировал предупреждения для неизбежных проблем

В Eclipse, перейдите к Окну> Предпочтения> Java> Компилятор> Ошибки/Предупреждения и под Универсальным типом, выберите флажок Ignore unavoidable generic type problems due to raw APIs

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

Некоторые комментарии:

  • я принял решение передать в Query вместо результата q.list(), потому что тот способ, с которым этот метод "обмана" может только использоваться для обмана, в спящем режиме, а не для обмана любого List в целом.
  • Вы могли добавить похожие методы для .iterate() и т.д.
97
ответ дан skia.heliou 24 November 2019 в 04:42
поделиться

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

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

0
ответ дан serg 6 October 2019 в 03:05
поделиться

Если Вы не хотите использовать @SuppressWarnings ("снял флажок") с Вами, может сделать следующее.

   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.

-5
ответ дан Joe Dean 24 November 2019 в 04:42
поделиться

У нас была та же проблема. Но это не было грандиозное предприятие для нас, потому что мы должны были решить другое больше главных проблем с, в спящем режиме Запрос и Сессия.

Конкретно:

  1. управление, когда транзакция могла фиксироваться. (мы хотели рассчитать, сколько раз был "запущен" tx, и только фиксируйте, когда tx был "закончен" то же количество раз, это было запущено. Полезный для кода, который не знает, должен ли он начать транзакцию. Теперь любой код, для которого нужен tx только, "запускает" один и заканчивает его при выполнении.)
  2. сбор Метрик производительности.
  3. Задержка, начинающая транзакцию, пока не будет известно, что что-то будет на самом деле сделано.
  4. более нежное поведение для query.uniqueResult ()

Так для нас, мы имеем:

  1. Создают интерфейс (AmplafiQuery), который расширяется, Запрос
  2. Создают класс (AmplafiQueryImpl), который расширяет AmplafiQuery и переносит org.hibernate. Запрос
  3. Создает Txmanager, который возвращает Tx.
  4. Tx имеет различный createQuery AmplafiQueryImpl

методов и возвратов И наконец,

, AmplafiQuery имеет "asList ()", который является универсальной включенной версией Query.list (), AmplafiQuery имеет "уникальный ()", который является универсальной включенной версией Query.uniqueResult () (и просто регистрирует проблему вместо того, чтобы выдать исключение)

, Это - большая работа для того, чтобы просто избежать @SuppressWarnings. Однако как я сказал (и перечислил) существует многое из другого лучше! причины сделать переносящуюся работу.

1
ответ дан Pat 24 November 2019 в 04:42
поделиться

Нет, но можно изолировать его в определенные методы запроса и подавить предупреждения с @SuppressWarnings("unchecked") аннотация.

2
ответ дан Dave L. 24 November 2019 в 04:42
поделиться

Это не контроль или ошибка. Предупреждение отражает реальную базовую проблему - нет никакого способа, которым компилятор Java может действительно быть уверен, что быть в спящем режиме класс собирается сделать, это - задание правильно и что список, который это возвращает, будет только содержать Кошек. Любое из предложений здесь прекрасно.

4
ответ дан paulmurray 24 November 2019 в 04:42
поделиться

В нашем коде мы аннотируем вызывающие методы:

@SuppressWarnings ("снял флажок")

, я знаю, что он походит на взлом, но co-разработчик, проверенный недавно и, нашел, что это было всем, что мы могли сделать.

5
ответ дан tyshock 24 November 2019 в 04:42
поделиться

Мы используем @SuppressWarnings("unchecked") также, но мы чаще всего пытаемся использовать его только на объявлении переменной, не на методе в целом:

public List<Cat> findAll() {
    Query q = sess.createQuery("from Cat cat");
    @SuppressWarnings("unchecked")
    List<Cat> cats = q.list();
    return cats;
}
21
ответ дан cretzel 24 November 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: