2010-04-15 9 views
6

Ein neuer Kollege hat gerade vorgeschlagen, benannte HQL-Abfragen in Hibernate mit Annotationen (z. B. @namedQuery) zu verwenden, anstatt HQL in unsere XxxxRepository-Klassen einzubetten.Sind Hibernate-HQL-Abfragen (in Annotationen) optimiert?

Was ich gerne wissen würde ist, ob die Verwendung der Annotation einen Vorteil bietet, abgesehen von der Zentralisierung von Abfragen?

Insbesondere gibt es einige Leistungszuwächse, zum Beispiel weil die Abfrage nur einmal beim Laden der Klasse geparst wird und nicht jedes Mal, wenn die Repository-Methode ausgeführt wird?

+0

und ich bevorzuge Kriterien Abfragen an beide ... – NimChimpsky

Antwort

8

von Pro EJB 3 (Mike Keith).

“... wir empfehlen benannte Abfragen, wann immer möglich Persistence Provider werden oft Schritte unternehmen, um JPQL vorzukompilieren Abfragen genannt als Teil der Bereitstellung oder Initialisierung auf SQL Phase einer Anwendung. "

Obwohl dieses Buch auf JPA basiert, gilt der allgemeine Hinweis für Hibernate. Da Hibernate geparste HQL/JPQL zwischenspeichert, werden Sie wahrscheinlich keinen großen Leistungszuwachs sehen. Ein weiterer Vorteil der Verwendung benannter Abfragen besteht darin, dass Sie die Möglichkeit erhalten, eine Abfrage mithilfe einer Zuordnungsdatei zum Zeitpunkt der Bereitstellung zu überschreiben, ohne die Anwendung neu erstellen zu müssen. nützlich, wenn Sie eine Abfrage in der Produktion optimieren müssen.

5

Abgesehen von jeder möglichen Leistungssteigerung glaube ich, dass ein weiterer Vorteil darin besteht, dass Sie sich mit SQL-Abfragen mit Anmerkungen vor SQL-Injection-Angriffen schützen können.

Für eine Webanwendung ist dies wichtig, wenn die Abfrage Benutzereingabedaten enthält.

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

3

Lars' Kommentar über SQL-Injection ist möglicherweise irreführend, obwohl ich es seine Absicht war nicht denken, und ich wollte ein wenig mehr Kontext schaffen, so dass der Kommentar nicht falsch verstanden wird.

Es ist wahr, dass benannte Abfragen nach Spezifikation parametrisiert werden, und die Verwendung von benannten Parametern ist ein Schritt beim Schutz vor SQL-Injection. Es schützt jedoch nicht vollständig vor einer SQL-Injektion (weitere Informationen finden Sie unter seinem Link). Der Wortlaut des Kommentars legt nahe, dass die Verwendung von benannten Abfragen der einzige notwendige Schritt bei der Abwehr von Injektionsangriffen ist. In der Realität können (und sollten) normale Abfragen parametrisiert werden und bieten genau die gleiche Isolationsstufe wie die benannten Abfragen, und das Parametrisieren Ihrer Abfragen ist nur einer von mehreren notwendigen Schritten, um Injektionsangriffe zu vereiteln.

Um den Kommentar von Lars über Webapps hinzuzufügen, beachten Sie, dass es wichtig ist, Daten vor injizierenden Angriffen zu schützen, unabhängig davon, ob die Anwendung extern ausgerichtet ist oder ob die Eingabedaten von einem Benutzer oder einer anderen Datenbank stammen (oder sogar die gleiche Datenbank).

2

Persönlich denke ich, dass der Leistungszuwachs weniger wichtig ist als die Tatsache, dass Ihre hql-Abfragen während des Serverstarts geparst werden und Sie mit Sofortnachrichten versorgen, wenn Ihre hql-Abfrage falsch ist.

Ich bevorzuge es, diese Fehler vor dem Testen statt während zu erfassen.

Das letzte Mal, während des Testens, kam ich auf eine Abfrage im Code, die nicht funktionierte, hatte tatsächlich nie funktioniert, wegen CaSiNg. Dies wäre beim Start des Servers bei Verwendung von benannten Abfragen sofort offensichtlich geworden.

Und natürlich mag ich nicht meine HQL mit Java-Code gemischt.