Ich arbeite in einem Projekt, das JPA ORM verwendet und Framework bietet zwei Arten von Methoden zum Erstellen von Abfragen.
Ich verstehe, dass die Art der Abfragezeichenfolge übergeben werden muss, um sie zu verwenden, aber ich weiß nicht genau, warum wir eine systemeigene Abfrage erstellen müssen. Wahrscheinlich wollen wir dort keine ORM-Funktionen verwenden?
Sie müssen keine native Abfrage erstellen, wenn Sie dies nicht möchten. JPQL wird schließlich vom Framework in SQL übersetzt, aber mit dem Framework können Sie auch die native Abfrage aufrufen. Warum würde das tun wollen:
createQuery verwendet die JPA-eigene Abfragesprache, die Sie aus Klassennamen anstelle von Tabellennamen auswählen. Dies ist kein SQL, es ist nur ähnlich und wird später in reales SQL umgewandelt. Die Zuordnung zu Java-Klassen erfolgt automatisch, und tatsächliche Klasseninstanzen werden als Ergebnis zurückgegeben.
createNativeQuery verwendet echtes SQL und kann JPA-Funktionen nicht verwenden. Diese Methode wird im Allgemeinen verwendet, wenn Sie etwas wirklich Ungewöhnliches tun müssen, das nicht von JPA unterstützt wird. Eine Liste von Object [] wird zurückgegeben, und die Zuordnung zu Java-Objekten muss manuell erfolgen. Mit anderen Worten, es ist so, als würde man mit einer DB arbeiten, bevor JPA kam, nur etwas bequemer, da die Verbindungsbehandlung automatisch erfolgt.
Ich habe es für Optimierungszwecke verwendet. Die Verwendung von systemeigenen Abfragen bedeutet, dass die ORM-Zuordnung nicht vorhanden ist und Sie anstelle von JPQL die systemeigene Syntax der Datenbank verwenden. So, wie @RasmusFranke auch darauf hinwies, wenn Sie etwas brauchen, das nicht von JPA unterstützt wird (wie wenn Sie DB-herstellerspezifische Erweiterungen verwenden möchten, was konzeptionell eine schlechte Idee ist, da JPA nichts über DB-Agnostiker ist, sondern trotzdem geschieht Ich weiß ...)
Der andere Effekt davon ist, dass bei Verwendung von systemeigenen Abfragen nur die angegebene Abfrage ausgeführt wird. Kein eifriges Holen von anderen Entitäten oder andere unerwünschte Sachen. Auf diese Weise können Sie, wenn Sie mit großen Mengen von Objekten arbeiten, einen Teil des Heapspeichers speichern.