Im vorherigen Artikel in dieser Reihe haben wir gezeigt, wie Java-Objekte in verschiedenen Datenspeichern beibehalten werden. Weitere Informationen finden Sie unterGuide to Java Data Objects.
JDO unterstützt verschiedene Abfragesprachen, um dem Entwickler die Flexibilität zu bieten, die ihm vertrauteste Abfragesprache zu verwenden.
2. JDO-Abfragesprachen
JDO unterstützt die folgenden Abfragesprachen:
JDOQL - eine Abfragesprache mit Java-Syntax
Typisiertes JDOQL - folgt der JDOQL-Syntax, bietet jedoch eine API, um die Verwendung der Abfragen zu vereinfachen.
SQL - wird nur für RDBMS verwendet.
JPQL - wird von Datanucleus bereitgestellt, ist jedoch nicht Teil der JDO-Spezifikationen.
3. Abfrage-API
3.1. Abfrage erstellen
Um eine Abfrage zu erstellen, müssen wir die Sprache sowie eine AbfrageString: angeben
Query query = pm.newQuery(
"javax.jdo.query.SQL",
"select * from product_item where price < 10");
Wenn wir die Sprache nicht angeben, wird standardmäßig JDOQL verwendet:
Query query = pm.newQuery(
"SELECT FROM com.example.jdo.query.ProductItem WHERE price < 10");
3.2. Erstellen einer benannten Abfrage
Wir können die Abfrage auch definieren und mit ihrem gespeicherten Namen darauf verweisen.
Dazu erstellen wir zunächst eineProductItem-Klasse:
@PersistenceCapable
public class ProductItem {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.INCREMENT)
int id;
String name;
String status;
String description;
double price;
//standard getters, setters & constructors
}
Als Nächstes fügen wir derMETA-INF/package.jdo-Datei eine Klassenkonfiguration hinzu, um eine Abfrage zu definieren und sie zu benennen:
Wir haben eine Abfrage mit dem Namen "PriceBelow10″." definiert
Wir können es in unserem Code verwenden:
Query query = pm.newNamedQuery(
ProductItem.class, "PriceBelow10");
List items = query.executeList();
3.3. Schließen einesQuery
Um Ressourcen zu sparen, können wir Abfragen schließen:
query.close();
Entsprechend können wir eine bestimmte Ergebnismenge schließen, indem wir sie als Parameter an die Methodeclose()übergeben:
query.close(ResultSet);
3.4. Kompilieren vonQuery
Wenn wir eine Abfrage validieren möchten, können wir die Methodecompile()aufrufen:
query.compile();
Wenn die Abfrage ungültig ist, gibt die MethodeJDOException. aus
4. JDOQL
JDOQL ist eine objektbasierte Abfragesprache, die die Leistungsfähigkeit der SQL-Sprache bietet und die Java-Objektbeziehungen im Anwendungsmodell beibehält.
JDOQL-Abfragen können insingle-Stringdefiniert werden.
Bevor wir tiefer eintauchen, gehen wir einige grundlegende Konzepte durch:
4.1. Kandidatenklasse
Die Kandidatenklasse in JDOQL muss eine dauerhafte Klasse sein. Wir verwenden den vollständigen Klassennamen anstelle des Tabellennamens in der SQL-Sprache:
Query query = pm.newQuery("SELECT FROM com.example.jdo.query.ProductItem");
List r = query.executeList();
Wie wir im obigen Beispiel sehen können, istcom.example.jdo.query.ProductItem hier die Kandidatenklasse.
4.2. Filter
Ein Filter kann in Java geschrieben werden, muss jedoch einen booleschen Wert ergeben:
Query query = pm.newQuery("SELECT FROM com.example.jdo.query.ProductItem");
query.setFilter("status == 'SoldOut'");
List result = query.executeList();
4.3. Methoden
JDOQL unterstützt nicht alle Java-Methoden, aber es unterstützt verschiedene Methoden, die wir aus der Abfrage aufrufen können und die in einem weiten Bereich verwendet werden können:
Für Eclipse können Sie die folgenden Schritte ausführen, um die kommentierte Verarbeitung zu aktivieren:
Gehen Sie zuJava Compiler und stellen Sie sicher, dass die Compiler-Konformitätsstufe 1,8 oder höher ist
Gehen Sie zuJava Compiler → Annotation Processing und aktivieren Sie die projektspezifischen Einstellungen und die Anmerkungsverarbeitung
Gehen Sie zuJava Compiler → Annotation Processing → Factory Path, aktivieren Sie die projektspezifischen Einstellungen und fügen Sie der Liste die folgenden Gläser hinzu:javax.jdo.jar,datanucleus-jdo-query.jar
Die obige Vorbereitung bedeutet, dass der Annotationsprozessor in der Datei datanucleus-jdo-query.jar bei jeder Kompilierung persistenter Klassen eine Abfrageklasse für jede mit@PersistenceCapable. annotierte Klasse generiert
In unserem Fall generiert der Prozessor eineQProductItem-Klasse. Die generierte Klasse hat fast den gleichen Namen wie die persistente Klasse, obwohl ein Q vorangestellt ist.
Wir können die Abfrageklasse verwenden, um auf die Kandidatenfelder zuzugreifen und die verfügbaren Java-Methoden zu verwenden.
6. SQL
JDO unterstützt die SQL-Sprache, falls wir ein RDBMS verwenden.
Erstellen wir eine SQL-Abfrage:
Query query = pm.newQuery("javax.jdo.query.SQL","select * from "
+ "product_item where price < ? and status = ?");
query.setClass(ProductItem.class);
query.setParameters(10,"InStock");
List results = query.executeList();
Wir habensetClass() für die Abfrage verwendet, umProductItem Objekte abzurufen, wenn wir die Abfrage ausführen. Andernfalls wird der TypObjectabgerufen.
7. JPQL
JDO DataNucleus bietet die JPQL-Sprache.
Erstellen wir eine Abfrage mit JPQL:
Query query = pm.newQuery("JPQL","select i from "
+ "com.example.jdo.query.ProductItem i where i.price < 10"
+ " and i.status = 'InStock'");
List results = (List) query.execute();
Der Entitätsname hier istcom.example.jdo.query.ProductItem.. Wir können nicht nur den Klassennamen verwenden. Dies liegt daran, dass JDO keine Metadaten zum Definieren eines Entitätsnamens wie JPA. hat. Wir habenProductItemp definiert und können danachp als verwenden Alias fürProductItem.
Weitere Informationen zur JPQL-Syntax finden Sie inlink.
8. Fazit
In diesem Artikel haben wir die verschiedenen Abfragesprachen gezeigt, die von JDO unterstützt werden. Wir haben gezeigt, wie benannte Abfragen für die Wiederverwendung gespeichert werden, und haben die JDOQL-Konzepte erläutert und gezeigt, wie SQL und JPQL mit JDO verwendet werden.
Die Codebeispiele im Artikel finden Sie inover on GitHub.