Warum müssen wir native Abfragen erstellen?

7

Ich arbeite in einem Projekt, das JPA ORM verwendet und Framework bietet zwei Arten von Methoden zum Erstellen von Abfragen.

  • entityManager.createQuery (Abfrage1);
  • entityManager.createNativeQuery (query2);

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?

    
Vardan Gupta 08.11.2012, 11:43
quelle

3 Antworten

11

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:

  • Zugriff auf niedriger Ebene, was bedeutet, dass Sie das Mapping selbst optimieren und handhaben können; Mit SQL greifen Sie tatsächlich auf die Datenbanktabelle zu, während Sie mit JPQL auf die Entitätsobjekte zugreifen;
  • Vielleicht möchten Sie JPQL nicht lernen, wenn Sie SQL
  • bereits kennen
  • Sie haben die Abfragen bereits in SQL geschrieben und haben keine Ressourcen / Zeit, um sie nach JPQL
  • zu portieren
m3th0dman 08.11.2012, 11:50
quelle
9

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.

    
Rasmus Franke 08.11.2012 11:46
quelle
4

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.

    
ppeterka 08.11.2012 11:50
quelle

Tags und Links