Я новичок с Hibernate, и я пишу простой метод для возврата списка объектов
соответствующий конкретному фильтру. 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
возвращает java.util.List
как необработанный тип. Мне показалось странным, что недавний Hibernate (4.0.x) не будет реализовывать параметризованные типы, поэтому я подозреваю, что он вместо этого сделал что-то неправильно.
Он очень похож на результат слияния гибернации на список объектов, но здесь у меня нет "жестких" ошибок (система знает тип Foo и I) m не используя SQLQuery, а прямой запрос). Так что никакой радости.
Я также рассмотрел Hibernate Class Cast Exception, поскольку он выглядел многообещающим, но потом я понял, что на самом деле я не получаю никаких Exception
... моей проблемы это только предупреждение - стиль кодирования, если вы это сделаете.
Документация на jboss.org, руководства Hibernate и несколько руководств, похоже, не охватывают тему такими подробностями (или я не искал в нужных местах?). Когда они вступают в детали, они используют литье на лету - и это на уроках, которые не были на официальном сайте jboss.org, поэтому я немного насторожен.
Код, однажды скомпилированный, работает без видимых проблем... что я знаю... еще; и результаты ожидаются.
Итак: правильно ли я это делаю? Мне что-то не хватает? Есть ли "официальная" или "рекомендуемый" способ сделать это?