2009-06-05 8 views
24

Hej wszystkim, jestem nowy w utrzymaniu/hibernacji i potrzebuję twojej pomocy.Java Persistence: Prześlij do czegoś wynik Query.getResultList()?

Oto sytuacja. Mam tabelę, która zawiera kilka rzeczy. Nazwijmy je Osobami. Chciałbym uzyskać wszystkie wpisy z bazy danych, które są w tej tabeli.

Mam klasy osoba, która jest prosta POJO z właściwości dla każdej kolumny w tabeli (imię i nazwisko, wiek, ..)

Oto co mam:

Query lQuery = myEntityManager.createQuery("from Person") 
List<Person> personList = lQuery.getResultList(); 

Jednak ja dostać ostrzeżenie, mówiąc, że jest to zaznaczone konwersja z List do List<Person>

myślałem, że po prostu zmiany kodu do

Query lQuery = myEntityManager.createQuery("from Person") 
List<Person> personList = (List<Person>)lQuery.getResultList(); 

będzie działać .. ale nie działa.

Czy istnieje sposób, aby to zrobić? Czy trwałość pozwala mi ustawić typ zwracanego zapytania? (Przez generycznych może?)

Odpowiedz

59

Jako nowicjusz WZP brała to jako jednoznacznej odpowiedzi, ale potem znalazłem lepszego poprzez to pytanie: Why in JPA EntityManager queries throw NoResultException but find does not?

Jej tak proste jak korzystanie TypedQuery zamiast Query np

TypedQuery<Person> lQuery = myEntityManager.createQuery("from Person", Person.class); 
List<Person> personList = lQuery.getResultList(); 
+0

Jesteś pan, dał mi najlepszą odpowiedź. Dziękuję Ci. ++++ 1 –

1

Też utknąłem z tym problemem przez pewien czas. Możesz powtórzyć listę i sprawdzić, ale wolałbym mniej hałasu. Najkrótszą drogą, jaką zobaczyłem, jest uciszenie ostrzeżenia, ale jestem z tego powodu bardzo nieswojo. Byłbym zainteresowany, aby zobaczyć inne rozwiązania.

@SuppressWarnings("unchecked") 
List<Person> personList = lQuery.getResultList(); 

Hmm, podczas poszukiwania znalazłem ciekawą post na java.net. Uważam, że komentarze użytkowników są szczególnie interesujące.

2

Dobrze jest rozwiązanie Kolekcje java klasy, ale nie wyjaśnił, w jaki sposób odlewania została braku, lub jeśli po prostu dając ostrzeżenie ...

Jest to jeden ze sposobów, aby to potwierdzić:

Collections.checkList(lQuery.getResultList(), Person.class); 

Ale jeśli nie trzeba go zweryfikować:

@SuppressWarnings("unchecked") List<Person> personList = lQuery.getResultList(); 
+0

nie wyjaśniają, jak mój odlew został niepowodzeniem, ponieważ to nie jest wadliwa. Po prostu nie wycisza Ostrzeżenia ... więc nic nie robi. – GuiSim

9

Uwaga: Ta odpowiedź jest przestarzały jak z JPA 2.0, który pozwala na określenie oczekiwanego produktu Typ mi. Zobacz this answer.


Pomijanie ostrzeżenia z

@SuppressWarnings("unchecked") 
List<MyType> result = (List<MyType>) query.getResultList(); 

jest jedynym rozwiązaniem tego problemu, jaki kiedykolwiek widziałem. Tłumienie jest brzydkie, ale możesz zaufać JPA, aby zwrócić właściwy typ obiektu, więc nie musisz sprawdzać ręcznie.

Jeśli używasz polimorfizmów i nie wiem dokładnie podać wynik, użycie rodzajowych z ograniczonym Class parametrem jest również wspólny wzór:

public List<T extends MyBaseType> findMyType(Class<T> type) { 
    @SuppressWarnings("unchecked") 
    List<T> result = (List<T>) this.entityManager.createQuery(
     "FROM " + type.getName()) 
     .getResultList(); 
    return result; 
} 
1

Alternatywna droga:

Query query = entityManager.createNativeQuery("SELECT * FROM person", Person.class); 
List<Person> rows = query.getResultList(); 
Powiązane problemy