2012-11-08 4 views
7

Pracuję w projekcie korzystającym z JPA ORM, a framework zapewnia dwa rodzaje metod tworzenia zapytań.Dlaczego potrzebujemy utworzyć zapytanie natywne?

  • entityManager.createQuery (zapytanie1);
  • entityManager.createNativeQuery (query2);

Rozumiem, że rodzaje ciągów zapytań należy przekazywać, aby z nich korzystać, ale nie wiem dokładnie, dlaczego potrzebujemy utworzyć zapytanie natywne? Prawdopodobnie nie chcemy używać tam możliwości ORM?

Odpowiedz

11

Nie musisz tworzyć natywnego zapytania, chyba że chcesz. JPQL ostatecznie jest tłumaczony na SQL przez framework, ale framework pozwala również na wywołanie natywnego zapytania. Dlaczego chcesz to zrobić:

  • Dostęp na niskim poziomie, co oznacza, że ​​możesz sam optymalizować i obsługiwać mapowanie; z SQL uzyskujesz dostęp do tabeli bazy danych, podczas gdy z JPQL uzyskujesz dostęp do obiektów encji;
  • Może nie chcą się uczyć JPQL jeśli już wiesz SQL
  • masz już zapytania napisane w SQL, i nie mają zasobów/czas do portu im JPQL
9

createQuery używa własnego języka zapytań JPA, wybierając z nazw klas zamiast nazw tabel. To nie jest SQL, jest po prostu podobny, a później przekształcony na prawdziwy SQL. Mapowanie do klas java zostanie wykonane automatycznie, a rzeczywiste wystąpienia klas zostaną zwrócone w wyniku.

createNativeQuery używa prawdziwego SQL i nie będzie mógł korzystać z funkcji JPA. Ta metoda jest używana ogólnie, jeśli musisz zrobić coś naprawdę dziwnego, co nie jest obsługiwane przez JPA. Lista obiektów [] zostanie zwrócona, a odwzorowanie obiektów java będzie musiało zostać wykonane ręcznie. Innymi słowy, to tak, jak praca z DB przed pojawieniem się JPA, tylko trochę wygodniejsza, ponieważ obsługa połączenia odbywa się automatycznie.

4

Użyłem go do celów optymalizacji. Używanie zapytań natywnych oznacza, że ​​mapowanie ORM nie jest na miejscu, a zamiast JPQL używa się natywnej składni DB. Tak więc, jak zauważył @RasmusFranke, jeśli potrzebujesz czegoś, co nie jest obsługiwane przez JPA (np. Gdy chcesz używać rozszerzeń specyficznych dla dostawcy bazy danych, co jest koncepcyjnie złym pomysłem, ponieważ JPA jest agnostyką DB, ale mimo to Wiem ...)

Innym efektem jest to, że przy użyciu natywnych zapytań uruchamiane jest tylko dostarczone zapytanie. Brak chętnego pobierania innych elementów lub innych niechcianych rzeczy. W ten sposób, jeśli zajmujesz się ogromnymi ilościami obiektów, możesz zaoszczędzić trochę miejsca na sterty.