Was ist zu verwenden: JPQL oder Kriterien-API? [geschlossen]

69

Meine Java-Anwendung verwendet JPA für die Objektpersistenz. Die Geschäftsdomäne ist sehr einfach (nur drei Klassen sind persistent, mit jeweils 3-5 Eigenschaften). Abfragen sind ebenfalls einfach. Die Frage ist, welchen Ansatz ich verwenden soll: JPQL oder Criteria API?

yegor256
quelle

Antworten:

79

Ich bin mir ziemlich sicher, dass dies hier auf SO bereits behandelt wurde, aber ich konnte die vorhandene Frage nicht finden. Also, hier ist mein Standpunkt zu der Frage:

  • Ich finde JPQL-Abfragen einfacher zu schreiben / lesen.
  • Ich finde die Kriterien-API gut zum Erstellen dynamischer Abfragen.

Welches ist im Grunde, was Sie in Hibernate: Criteria vs. HQL finden .

Es gibt jedoch einen wesentlichen Unterschied zwischen der JPA 2.0-Kriterien-API und der Hibernate-Kriterien-API, der erwähnenswert ist: Die JPA 2.0-Kriterien-API ist eine typsichere API und bietet somit Überprüfungen der Kompilierungszeit, Code-Vervollständigung, bessere Unterstützung für Refactoring usw. Ich jedoch Finden Sie nicht, dass die Vorteile die Benutzerfreundlichkeit von JPQL überwiegen.

Zusammenfassend würde ich JPQL bevorzugen, außer für dynamische Abfragen (z. B. für Suchfunktionen mit mehreren Kriterien).

Verwandte Fragen

Mehr Ressourcen

Pascal Thivent
quelle
3
Es tut mir leid JPQL, dass ich den alten Thread wiederbelebt habe, aber ich sollte ihn nicht so weit wie möglich vermeiden. Ich sage nicht, dass es eine schlechte Praxis ist, JPQL zu verwenden, sondern ich sage nur, wenn etwas mit Kriterien getan werden kann, sollte dies ohne JPQL geschehen. Ich bitte Sie nur demütig um mehr Klarheit, indem Sie Ihre Präferenz für JPQL gegenüber Kriterien in Frage stellen.
Shahzeb
5
@ Shahzeb Nein, absolut nicht. Verwenden Sie die Kriterien-API nicht für statische Daten - dh wenn es möglich ist, die Abfrage zur Kompilierungszeit als JPQL zu schreiben, sollten Sie JPQL verwenden. Natürlich nicht in Form von Zeichenfolgen, die im Code verteilt sind. Diese sind zu vermeiden. aber als benannte Abfragen. Diese werden zum Startzeitpunkt und sogar zum Bearbeitungszeitpunkt von einigen IDEs analysiert.
Hauke ​​Ingmar Schmidt
9

Ich habe zuvor eine ähnliche Frage beantwortet und werde meine Antwort hier zum Nutzen der Community erneut veröffentlichen. Ich gehe davon aus, dass Sie einen Anwendungsserver für meine Antwort unten verwenden.

Die Kriterien-API ermöglicht die typsichere Erstellung dynamischer SQL-Abfragen, die eine SQL-Injection verhindern. Andernfalls würden Sie SQL-Zeichenfolgen miteinander verketten, was sowohl fehleranfällig als auch ein Sicherheitsrisiko darstellt: z. B. SQL Injection. Dies wäre das einzige Mal, dass Sie die Kriterien-API verwenden möchten.

Wenn die Abfrage im Wesentlichen dieselbe bleibt, aber nur unterschiedliche Parameter akzeptieren muss, sollten Sie Anmerkungen verwenden, @NamedQueriesdie einfacher und vorkompilierter sind, im sekundären Cache zwischengespeichert und möglicherweise während des Serverstarts überprüft werden können.

Dies ist im Grunde die Faustregel für Kriterienabfragen im Vergleich zu @NamedQueries. Nach meiner Erfahrung benötigen Sie die Kriterien-API selten, aber es ist gut, dass sie für die seltenen Fälle vorhanden ist, in denen sie erforderlich ist.

Hoffe das hilft.

Sagneta
quelle
Die Verkettung konstanter Zeichenfolgen zum Erstellen einer JPQL-Abfrage ist kein Sicherheitsrisiko. Genau das macht der CriteriaBuilder. Was ist der Vorteil von CriteriaBuilder, außer dass der Code vollständig unlesbar und unverständlich wird?
Bebbo
-2

Ich denke, Sie können auch ein anderes neues Framework in Betracht ziehen, wie:

Abfrage Dsl

Objektabfrage

Torpedo-Abfrage

Dies gibt Ihnen eine typsichere und intelligente Möglichkeit, Abfragen zu erstellen. Dies ist kein Standard, aber ich bin mir ziemlich sicher, dass der nächste Standard auf einer dieser Technologien basieren wird.

Wenn Sie auf den Standards bleiben möchten, ignorieren Sie dies.

Tschüss

tglman
quelle
Dies hat keinen Bezug zu der Frage, ob das besser ist und nur als Kommentar zur ursprünglichen Frage hätte hinzugefügt werden sollen
Adrian Legaspi