JDOクエリ入門2/2

JDOクエリの紹介2/2

1. 概要

このシリーズの前回の記事では、Javaオブジェクトをさまざまなデータストアに永続化する方法を示しました。 詳細については、Guide to Java Data Objectsを確認してください。

JDOはさまざまなクエリ言語をサポートしているため、開発者が最も精通しているクエリ言語を柔軟に使用できます。

2. JDOクエリ言語

JDOは次のクエリ言語をサポートしています。

  • JDOQL – Java構文を使用したクエリ言語

  • 型付きJDOQL – JDOQL構文に従いますが、クエリの使用を容易にするAPIを提供します。

  • SQL-RDBMSにのみ使用されます。

  • JPQL – Datanucleusによって提供されますが、JDO仕様の一部ではありません。

3. クエリAPI

3.1. クエリの作成

クエリを作成するには、言語とクエリString:を指定する必要があります

Query query = pm.newQuery(
  "javax.jdo.query.SQL",
  "select * from product_item where price < 10");

言語を指定しない場合、デフォルトはJDOQLになります。

Query query = pm.newQuery(
  "SELECT FROM com.example.jdo.query.ProductItem WHERE price < 10");

3.2. 名前付きクエリの作成

クエリを定義して、保存された名前で参照することもできます。

そのためには、最初にProductItemクラスを作成します。

@PersistenceCapable
public class ProductItem {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.INCREMENT)
    int id;
    String name;
    String status;
    String description;
    double price;

    //standard getters, setters & constructors
}

次に、クラス構成をMETA-INF/package.jdoファイルに追加してクエリを定義し、名前を付けます。


    
        
            
            
            
        
    

PriceBelow10″.」という名前のクエリを定義しました

コードで使用できます:

Query query = pm.newNamedQuery(
  ProductItem.class, "PriceBelow10");
List items = query.executeList();

3.3. Queryを閉じる

リソースを節約するために、クエリを閉じることができます:

query.close();

同様に、close()メソッドにパラメーターとして渡すことにより、特定の結果セットを閉じることができます。

query.close(ResultSet);

3.4. Queryのコンパイル

クエリを検証する場合は、compile()メソッドを呼び出すことができます。

query.compile();

クエリが有効でない場合、メソッドはJDOException.をスローします

4. JDOQL

JDOQLはオブジェクトベースのクエリ言語であり、SQL言語の能力を提供し、アプリケーションモデルでJavaオブジェクトの関係を保持するように設計されています。

JDOQLクエリは、single-String形式で定義できます。

深く掘り下げる前に、いくつかの基本的な概念を見ていきましょう。

4.1. 候補者クラス

JDOQLの候補クラスは、永続可能なクラスである必要があります。 SQL言語では、テーブル名の代わりに完全なクラス名を使用しています。

Query query = pm.newQuery("SELECT FROM com.example.jdo.query.ProductItem");
List r = query.executeList();

上記の例でわかるように、com.example.jdo.query.ProductItemはここでの候補クラスです。

4.2. フィルタ

フィルターはJavaで作成できますが、ブール値に評価する必要があります。

Query query = pm.newQuery("SELECT FROM com.example.jdo.query.ProductItem");
query.setFilter("status == 'SoldOut'");
List result = query.executeList();

4.3. 方法

JDOQLはすべてのJavaメソッドをサポートしているわけではありませんが、クエリから呼び出すことができ、幅広い範囲で使用できるさまざまなメソッドをサポートしています。

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

サポートされているメソッドの詳細については、このlinkを確認してください。

4.4. パラメーター

パラメータとしてクエリに値を渡すことができます。 パラメータを明示的または暗黙的に定義できます。

パラメーターを明示的に定義するには:

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

これは、setParametersメソッドを使用して実現することもできます。

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

パラメータタイプを定義しないことで、暗黙的に行うことができます。

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

5. JDOQLタイプ

JDOQLTypedQueryAPIを使用するには、環境を準備する必要があります。

5.1. Mavenセットアップ


    org.datanucleus
    datanucleus-jdo-query
    5.0.2

...

    
        maven-compiler-plugin
        
            1.8
            1.8
        
    

これらの依存関係の最新バージョンはdatanucleus-jdo-querymaven-compiler-plugin.です

5.2. 注釈処理の有効化

Eclipseの場合、以下の手順に従って注釈付き処理を有効にできます。

  1. Java Compilerに移動し、コンパイラのコンプライアンスレベルが1.8以上であることを確認します

  2. Java Compiler → Annotation Processingに移動し、プロジェクト固有の設定を有効にして、注釈処理を有効にします

  3. Java Compiler → Annotation Processing → Factory Pathに移動し、プロジェクト固有の設定を有効にしてから、次のjarをリストに追加します。javax.jdo.jar,datanucleus-jdo-query.jar

上記の準備は、永続クラスをコンパイルするたびに、datanucleus-jdo-query.jarのアノテーションプロセッサが@PersistenceCapable.でアノテーションが付けられた各クラスのクエリクラスを生成することを意味します。

この場合、プロセッサはQProductItemクラスを生成します。 生成されたクラスには、接頭辞Qが付いていますが、持続可能クラスとほぼ同じ名前が付けられています。

5.3. JDOQL型付きクエリを作成します。

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();

クエリクラスを使用して候補フィールドにアクセスし、使用可能なJavaメソッドを使用できます。

6. SQL

RDOMSを使用している場合、JDOはSQL言語をサポートします。

SQLクエリを作成しましょう:

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();

クエリの実行時にProductItemオブジェクトを取得するために、クエリにsetClass()を使用しました。 それ以外の場合は、Objectタイプを取得します。

7. JPQL

JDO DataNucleusはJPQL言語を提供します。

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();

ここでのエンティティ名はcom.example.jdo.query.ProductItem.です。クラス名のみを使用することはできません。 これは、JDOにJPA.のようなエンティティ名を定義するためのメタデータがないためです。ProductItempを定義し、その後、pをとして使用できます。 ProductItem.を参照するエイリアス

JPQL構文の詳細については、このlinkを確認してください。

8. 結論

この記事では、JDOでサポートされているさまざまなクエリ言語を示しました。 再利用のために名前付きクエリを保存する方法を示し、JDOQLの概念を説明し、JDOでSQLとJPQLを使用する方法を示しました。

この記事のコード例はover on GitHubにあります。