Frage

Gibt es eine Heuristik / Best Practice / Regelsatz für eine Entscheidung zwischen der Kriterien-API und NamedQuery ?

Meine bisherigen Gedanken:
Benannte Abfragen sind im Allgemeinen besser lesbar.Kriterienabfragen sind flexibler.
Beide sind vorkompiliert.Ich neige dazu, benannte Abfragen so lange wie möglich zu verwenden und dann zu Kriterien zu wechseln.

Aber vielleicht Der Drang, die Abfrage unter Verwendung der Kriterien-API zu "flexifizieren", ist ein Hinweis auf ein suboptimales Design (d. h. Trennung von Bedenken).

Danke

War es hilfreich?

Lösung

Benannte Abfragen sind optimaler (sie werden einmal analysiert / vorbereitet).Kriterienabfragen sind dynamisch (sie werden nicht vorkompiliert, obwohl einige JPA-Anbieter wie EclipseLink einen Kriterienvorbereitungscache verwalten).

Ich würde Kriterien nur für dynamische Abfragen verwenden.

Andere Tipps

Kriterienabfragen sind eine gute Wahl, wenn eine Abfrage dynamisch generiert werden muss, beispielsweise basierend auf variablen und mehreren Suchkriterien.

Bei statischen Abfragen ist JPQL viel besser lesbar, und ich bevorzuge die Verwendung als Kriterienabfragen.Sie könnten etwas an Sicherheit verlieren, aber die Unit-Tests sollten Sie sicherer machen.

Ein weiterer Gesichtspunkt ist, dass die Kriterienabfrage zwar nicht so lesbar, aber typsicher ist und Sie daher die Überprüfung des Typs zur Kompilierungszeit ermöglichen.Wenn Sie die Datenbank in Projekten ändern, in denen es viele Entitäten und Abfragen gibt, ist es sehr hilfreich, beim Kompilieren zu sehen, welche Abfragen aufgrund der Änderung fehlgeschlagen sind.

Andererseits bin ich mir nicht sicher, ob dies vorteilhafter ist als die Einfachheit von JPQL

Ich habe tatsächlich die Hibernate-Quelle (4.3.0-SNAPSHOT) und die EclipseLink-Quelle (2.5.0-SNAPSHOT) durchgesehen und die JPA-Implementierung in jeder Quelle durchgesehen.

EclipseLink ist in der von Ihnen beschriebenen Weise eindeutig nicht threadsicher.Insbesondere wird versucht, Verknüpfungen wiederholt neu zu berechnen.

Die Implementierung von Hibernate sieht für mich threadsicher aus.Ich bin nicht 100% sicher, aber es scheint zu sein.Ich würde sagen, dass dies in Zukunft nicht garantiert ist, da es nicht spezifiziert ist.

Ich werde Sie jedoch warnen, ich glaube nicht, dass Sie viel gewinnen werden.Nach meinem Dafürhalten wird ein Großteil der Kompilierung der Abfrage tatsächlich während der "createQuery" -Phase durchgeführt, sodass Sie nicht einmal viel zwischenspeichern der Ergebnisse gewinnen würden.

JPA bietet auch eine Möglichkeit zum Erstellen statischer Abfragen als benannte Abfragen unter Verwendung der Annotationen @NamedQuery und @NamedQueries.In JPA wird es als bewährte Methode angesehen, benannte Abfragen nach Möglichkeit dynamischen Abfragen vorzuziehen.Von http://www.objectdb.com/java/jpa/query/api

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top