Einführung zu JDO-Abfragen 2/2

Einführung in JDO Queries 2/2

1. Überblick

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:

query.setFilter("this.name.startsWith('supported')");

Weitere Informationen zu den unterstützten Methoden finden Sie inlink.

4.4. Parameter

Wir können Werte als Parameter an Abfragen übergeben. Wir können die Parameter entweder explizit oder implizit definieren.

So definieren Sie einen Parameter explizit:

Query query = pm.newQuery(
  "SELECT FROM com.example.jdo.query.ProductItem "
  + "WHERE price < threshold PARAMETERS double threshold");
List result = (List) query.execute(10);

Dies kann auch mit der MethodesetParameterserreicht werden:

Query query = pm.newQuery(
  "SELECT FROM com.example.jdo.query.ProductItem "
  + "WHERE price < :threshold");
query.setParameters("double threshold");
List result = (List) query.execute(10);

Wir können dies implizit tun, indem wir keinen Parametertyp definieren:

Query query = pm.newQuery(
  "SELECT FROM com.example.jdo.query.ProductItem "
  + "WHERE price < :threshold");
List result = (List) query.execute(10);

5. JDOQL typisiert

Um JDOQLTypedQueryAPI verwenden zu können, müssen wir die Umgebung vorbereiten.

5.1. Maven Setup


    org.datanucleus
    datanucleus-jdo-query
    5.0.2

...

    
        maven-compiler-plugin
        
            1.8
            1.8
        
    

Die neuesten Versionen dieser Abhängigkeiten sinddatanucleus-jdo-query undmaven-compiler-plugin.

5.2. Aktivieren der Anmerkungsverarbeitung

Für Eclipse können Sie die folgenden Schritte ausführen, um die kommentierte Verarbeitung zu aktivieren:

  1. Gehen Sie zuJava Compiler und stellen Sie sicher, dass die Compiler-Konformitätsstufe 1,8 oder höher ist

  2. Gehen Sie zuJava Compiler → Annotation Processing und aktivieren Sie die projektspezifischen Einstellungen und die Anmerkungsverarbeitung

  3. 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.

5.3. JDOQL-typisierte Abfrage erstellen:

JDOQLTypedQuery tq = pm.newJDOQLTypedQuery(ProductItem.class);
QProductItem cand = QProductItem.candidate();
tq = tq.filter(cand.price.lt(10).and(cand.name.startsWith("pro")));
List results = tq.executeList();

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.