2010-04-15 9 views
6

Nowy użytkownik zaproponował użycie nazwanych zapytań HQL w Hibernate z adnotacjami (np. @NamedQuery) zamiast osadzania HQL w naszych klasach XxxxRepository.Czy Hibernate zwane zapytaniami HQL (w adnotacjach) jest zoptymalizowane?

Co chciałbym wiedzieć, czy użycie adnotacji zapewnia jakąkolwiek przewagę, z wyjątkiem centralizacji zapytań?

Czy w niektórych przypadkach zyskuje się niektóre wyniki, na przykład dlatego, że zapytanie jest analizowane tylko raz, gdy klasa jest ładowana, a nie za każdym razem, gdy wykonywana jest metoda Repository?

+0

i preferuję zapytania kryterialne do obu ... – NimChimpsky

Odpowiedz

8

z Pro EJB 3 (Mike Keith).

”... zalecamy nazwanych zapytań gdy operatorzy możliwe Trwałość często podejmują kroki w celu precompile JPQL nazwie zapytań do SQL jako część rozmieszczenia lub inicjalizacji faza aplikacji. "

Mimo że ta książka jest na WZP, ogólne porady dotyczą Hibernacji. Jednak, ponieważ pamięć podręczna Hibernuj parsuje HQL/JPQL, prawdopodobnie nie dostrzeżesz dużego przyrostu wydajności. Kolejną zaletą korzystania z nazwanych zapytań jest to, że daje możliwość przesłonięcia zapytania przy użyciu pliku odwzorowania w czasie wdrażania bez konieczności ponownego budowania aplikacji; przydatne, jeśli potrzebujesz zmodyfikować zapytanie w produkcji.

5

Poza możliwym wzrostem wydajności, wierzę, że kolejną korzyścią będzie to, że używając kwerend HQL z adnotacjami, możesz zabezpieczyć się przed atakami SQL Injection.

Dla aplikacji internetowej jest to ważne, jeśli zapytanie zawiera dane wejściowe użytkownika. Komentarz

http://en.wikipedia.org/wiki/SQL_injection

3

Larsa dotyczące SQL injection jest potencjalnie mylące, chociaż nie sądzę, żeby to było jego intencją, i chciałem dostarczyć trochę więcej kontekstu tak, że komentarz nie jest źle.

To prawda, że ​​nazwane zapytania są sparametryzowane według specyfikacji, a użycie nazwanych parametrów jest krokiem w kierunku ochrony przed iniekcją SQL. Jednak nie w pełni chroni przed iniekcją SQL (więcej informacji znajduje się w jego linku). Sformułowanie komentarza sugeruje, że stosowanie nazwanych zapytań jest jedynym niezbędnym krokiem w celu ochrony przed atakami iniekcyjnymi. W rzeczywistości, normalne zapytania mogą (i powinny) być sparametryzowane i zapewnią dokładnie taki sam poziom izolacji od ataku iniekcyjnego, jak nazwane zapytania, a parametryzowanie zapytań jest tylko jednym z wielu niezbędnych kroków w udaremnieniu iniekcji.

Aby dodać do komentarza Larsa na temat aplikacji internetowych, należy pamiętać, że ważne jest wyszukanie danych w celu ochrony przed atakami wtryskowymi, niezależnie od tego, czy aplikacja jest zewnętrznie skierowana czy nie, czy dane wejściowe pochodzą od użytkownika lub z innej bazy danych (lub nawet ta sama baza danych).

2

Osobiście uważam, że przyrost wydajności jest mniej ważny niż fakt, że kwerendy hql są analizowane podczas uruchamiania serwera, dostarczając wiadomości błyskawiczne, jeśli kwerenda hql jest niepoprawna.

Wolę przechwytywać te błędy przed testowaniem zamiast w trakcie.

Ostatni raz, podczas testów, natrafiłem na zapytanie w kodzie, które nie działało, w rzeczywistości nigdy nie działało, z powodu CaSiNg. Byłoby to natychmiast widoczne podczas uruchamiania serwera przy użyciu nazwanych zapytań.

I, oczywiście, nie podoba mi się, że moje HQL miesza się z kodem Java.

Powiązane problemy