Я новачок у режимі глибокого сну і пишу простий метод повернення списку об'єктів, що відповідають певному фільтру. List<Foo>
здавалося природним типом повернення.
Що б я не робив, здається, я не можу зробити компілятора щасливим, якщо не найняти некрасивого @SuppressWarnings
.
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
public class Foo {
public Session acquireSession() {
// All DB opening, connection etc. removed,
// since the problem is in compilation, not at runtime.
return null;
}
@SuppressWarnings("unchecked") /* <----- */
public List<Foo> activeObjects() {
Session s = acquireSession();
Query q = s.createQuery("from foo where active");
return (List<Foo>) q.list();
}
}
Я хотів би позбутися цьогоSuppressWarnings
. Але якщо я це роблю, я отримую попередження
Warning: Unchecked cast from List to List<Foo>
(Я можу проігнорувати це, але спочатку хотів би не отримувати його), і якщо я видалю загальний для відповідності .list()
типу повернення, я отримую попередження
Warning: List is a raw type. References to generic type List<E>
should be parameterized.
Я помітив , що org.hibernate.mapping
робить оголосити List
; але це зовсім інший тип - Query
повертає a java.util.List
, як необроблений тип. Я вважаю дивним, що нещодавній Hibernate (4.0.x) не реалізував параметризовані типи, тому я підозрюю, що це я замість цього роблю щось не так.
Це дуже схоже на результат Cast Hibernate до списку об'єктів , але тут у мене немає "жорстких" помилок (система знає тип Foo, і я використовую не SQLQuery, а прямий запит). Тож ніякої радості.
Я також розглянув виняток Hibernate Class Cast, оскільки він виглядав багатообіцяючим, але потім я зрозумів, що насправді не отримую жодної Exception
... моя проблема полягає лише у попередженні - стилі кодування, якщо хочете.
Документація на jboss.org, посібники Hibernate та кілька навчальних посібників, схоже, не висвітлюють теми настільки детально (або я не шукав у потрібних місцях?). Коли вони все-таки докладаються до деталей, вони використовують кастинг на льоту - і це в підручниках, яких не було на офіційному сайті jboss.org, тому я трохи насторожений.
Код, після компіляції, працює без явних проблем ... про які я знаю ... поки; а результати - очікувані.
Отже: чи правильно я це роблю? Мені не вистачає чогось очевидного? Чи існує «офіційний» чи «рекомендований» спосіб зробити це ?