Jestem nowicjuszem w Hibernate i piszę prostą metodę zwracania listy obiektów pasujących do określonego filtra. List<Foo>
wydawało się naturalnym typem powrotu.
Cokolwiek robię, nie mogę uszczęśliwić kompilatora, chyba że użyję brzydkiego @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();
}
}
Chciałbym się tego pozbyćSuppressWarnings
. Ale jeśli to zrobię, otrzymam ostrzeżenie
Warning: Unchecked cast from List to List<Foo>
(Mogę to zignorować, ale w pierwszej kolejności nie chciałbym tego dostać), a jeśli usunę rodzaj ogólny, aby dostosować się do .list()
zwracanego typu, otrzymuję ostrzeżenie
Warning: List is a raw type. References to generic type List<E>
should be parameterized.
Zauważyłem, że org.hibernate.mapping
ma zadeklarować List
; ale jest to zupełnie inny typ - Query
zwraca a java.util.List
, jako typ surowy. Wydaje mi się dziwne, że niedawny Hibernate (4.0.x) nie zaimplementował sparametryzowanych typów, więc podejrzewam, że to ja zamiast tego robię coś złego.
Wygląda to bardzo podobnie do wyniku Cast Hibernate na liście obiektów , ale tutaj nie mam „twardych” błędów (system zna typ Foo i nie używam zapytania SQLQuery, ale prostego zapytania). Więc nie ma radości.
Przyjrzałem się również Wyjątkowi rzutowania klasy Hibernate, ponieważ wyglądał obiecująco, ale potem zdałem sobie sprawę, że tak naprawdę nie dostaję żadnego Exception
... moim problemem jest tylko ostrzeżenie - styl kodowania, jeśli wolisz.
Dokumentacja na jboss.org, podręczniki Hibernate i kilka samouczków nie wydają się opisywać tego tematu w tak szczegółowy sposób (czy nie szukałem w odpowiednich miejscach?). Kiedy wchodzą w szczegóły, używają castingu w locie - i to w samouczkach, których nie było na oficjalnej stronie jboss.org, więc jestem trochę ostrożny.
Po skompilowaniu kod działa bez widocznego problemu… o którym wiem… jeszcze; a rezultaty są oczekiwane.
Więc: czy robię to dobrze? Czy brakuje mi czegoś oczywistego? Czy istnieje „oficjalny” lub „zalecany” sposób na zrobienie tego ?