Na przykład mam takie zapytanie:
Query q = sess.createQuery("from Cat cat");
List cats = q.list();
Jeśli spróbuję zrobić coś takiego, pojawia się następujące ostrzeżenie
Type safety: The expression of type List needs unchecked conversion to conform to List<Cat>
List<Cat> cats = q.list();
Czy jest sposób, aby tego uniknąć?
sess.createQuery("from Cat cat", Cat.class);
jak wspomniał Elazar.Odpowiedzi:
@SuppressWarnings
Jak sugerowano, używanie wszędzie jest dobrym sposobem, chociaż wymaga odrobiny pisania palcem za każdym razem, gdy dzwoniszq.list()
.Sugeruję dwie inne techniki:
Napisz pomocnika obsady
Po prostu zrefaktoryzuj wszystko
@SuppressWarnings
w jednym miejscu:Zapobiegaj generowaniu przez Eclipse ostrzeżeń o nieuniknionych problemach
W Eclipse przejdź do Okno> Preferencje> Java> Kompilator> Błędy / ostrzeżenia i w obszarze Typ ogólny zaznacz pole wyboru
Ignore unavoidable generic type problems due to raw APIs
Spowoduje to wyłączenie niepotrzebnych ostrzeżeń o podobnych problemach, takich jak opisany powyżej, których nie można uniknąć.
Kilka komentarzy:
Query
zamiast wynikuq.list()
ponieważ w ten sposób ta metoda „oszukiwania” może być używana tylko do oszukiwania za pomocą Hibernate, a nieList
ogólnie do oszukiwania ..iterate()
itp.źródło
Collections.checkedList()
metoda nie usunie ostrzeżenia o niezaznaczonym przypisaniu.Minęło dużo czasu, odkąd zadano to pytanie, ale mam nadzieję, że moja odpowiedź może być pomocna dla kogoś takiego jak ja.
Jeśli spojrzysz na dokumentację javax.persistence api , zobaczysz, że od tamtej pory dodano tam kilka nowych metod
Java Persistence 2.0
. Jednym z nich jestcreateQuery(String, Class<T>)
powrótTypedQuery<T>
. Możesz używaćTypedQuery
tak, jak to zrobiłeśQuery
z tą małą różnicą, że wszystkie operacje są teraz bezpieczne.Więc po prostu zmień swój kod na coś takiego:
I wszystko gotowe.
źródło
My też używamy
@SuppressWarnings("unchecked")
, ale najczęściej staramy się używać go tylko na deklaracji zmiennej, a nie na metodzie jako całości:źródło
Spróbuj użyć
TypedQuery
zamiastQuery
. Na przykład zamiast tego: -Użyj tego:-
źródło
Criteria
?W naszym kodzie opisujemy metody wywołujące:
@SuppressWarnings („niezaznaczone”)
Wiem, że wygląda to na włamanie, ale współtwórca sprawdził ostatnio i stwierdził, że to wszystko, co możemy zrobić.
źródło
Najwyraźniej metoda Query.list () w interfejsie Hibernate API nie jest bezpieczna pod względem typu „z założenia” i nie ma planów jej zmiany .
Uważam, że najprostszym sposobem uniknięcia ostrzeżeń kompilatora jest rzeczywiście dodanie @SuppressWarnings („niezaznaczone”). Można umieścić tę adnotację na poziomie metody lub, jeśli znajduje się wewnątrz metody, tuż przed deklaracją zmiennej.
Jeśli masz metodę, która hermetyzuje Query.list () i zwraca List (lub Collection), również otrzymasz ostrzeżenie. Ale ten jest pomijany za pomocą @SuppressWarnings ("rawtypes").
Metoda listAndCast (Query) zaproponowana przez Matta Quaila jest mniej elastyczna niż Query.list (). Chociaż mogę:
Jeśli spróbuję poniższy kod:
Wystąpi błąd kompilacji: Niezgodność typu: nie można przekonwertować z listy na ArrayList
źródło
To nie jest przeoczenie ani błąd. Ostrzeżenie odzwierciedla rzeczywisty podstawowy problem - nie ma możliwości, aby kompilator java mógł naprawdę mieć pewność, że klasa hibernacji wykona swoje zadanie poprawnie i że lista, którą zwróci, będzie zawierała tylko Cats. Każda z poniższych sugestii jest w porządku.
źródło
Nie, ale można go wyodrębnić do określonych metod zapytań i pominąć ostrzeżenia za pomocą
@SuppressWarnings("unchecked")
adnotacji.źródło
Nowsze wersje Hibernacji obsługują teraz
Query<T>
obiekt bezpieczny dla typu, więc nie musisz już używać@SuppressWarnings
ani implementować hackowania, aby ostrzeżenia kompilatora zniknęły. W API sesji ,Session.createQuery
będą teraz zwracać typ bezpiecznyQuery<T>
obiekt. Możesz to wykorzystać w ten sposób:Możesz go również użyć, gdy wynik zapytania nie zwróci Cat:
Lub podczas częściowego wyboru:
źródło
Mieliśmy ten sam problem. Ale to nie była dla nas wielka sprawa, ponieważ musieliśmy rozwiązać inne, bardziej poważne problemy z Hibernate Query and Session.
Konkretnie:
Więc dla nas mamy:
I wreszcie
AmplafiQuery ma "asList ()", która jest generyczną włączoną wersją Query.list () AmplafiQuery ma "unique ()", czyli generyczną włączoną wersję Query.uniqueResult () (i po prostu rejestruje problem, zamiast wyrzucać wyjątek)
To dużo pracy, jeśli chodzi o unikanie @SuppressWarnings. Jednak, jak powiedziałem (i wymieniłem), jest wiele innych lepszych! powody, dla których warto wykonać owijanie.
źródło
Wiem, że to jest starsze, ale na dzień dzisiejszy należy odnotować 2 punkty w odpowiedzi Matt Quails.
Punkt 1
To
Powinien być taki
Punkt 2
Od tego
do tego
zredukowałby inne ostrzeżenia, oczywiście w oryginalnych znacznikach znaczników odpowiedzi zostały usunięte przez przeglądarkę.
źródło
Spróbuj tego:
źródło
cat
instancją.Dobrym rozwiązaniem, aby uniknąć ostrzeżeń dotyczących bezpieczeństwa typów za pomocą zapytania hibernacji, jest użycie narzędzia takiego jak TorpedoQuery, które pomoże Ci zbudować bezpieczny typ hql.
źródło
źródło
Jeśli nie chcesz używać @SuppressWarnings („niezaznaczone”), możesz wykonać następujące czynności.
FYI - stworzyłem metodę util, która robi to za mnie, więc nie zaśmieca mojego kodu i nie muszę używać @SupressWarning.
źródło