1概要

このシリーズの前回の記事では、Javaオブジェクトをさまざまなデータ・ストアに永続化する方法を説明しました。詳細については、リンク:/jdo[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.baeldung.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

ファイルにクラス構成を追加してクエリを定義し、名前を付けます。

<jdo>
    <package name="com.baeldung.jdo.query">
        <class name="ProductItem" detachable="true" table="product__item">
            <query name="PriceBelow10" language="javax.jdo.query.SQL">
            <![CDATA[SELECT **  FROM PRODUCT__ITEM WHERE PRICE < 10]]>
            </query>
        </class>
    </package>
</jdo>

“ __PriceBelow10 ”という名前のクエリを定義しました。

私たちのコードでそれを使うことができます:

Query<ProductItem> query = pm.newNamedQuery(
  ProductItem.class, "PriceBelow10");
List<ProductItem> 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.baeldung.jdo.query.ProductItem");
List<ProductItem> r = query.executeList();

上記の例でわかるように、

com.baeldung.jdo.query.ProductItem

がここでの候補クラスです。


4.2. フィルタ

フィルタはJavaで書くことができますが、ブール値に評価される必要があります。

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


4.3. メソッド

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

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

サポートされているメソッドの詳細については、こちらをご覧ください。


4.4. パラメーター

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

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

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

これは

setParameters

メソッドを使っても実現できます。

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

パラメータ型を定義しないことで暗黙のうちにそれを行うことができます。

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


5 JDOQL型付き

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


5.1. Mavenのセットアップ

<dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-jdo-query</artifactId>
    <version>5.0.2</version>
</dependency>
...
<plugins>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

これらの依存関係の最新バージョンはhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.datanucleus%22%20AND%20a%3A%22datanucleus-jdo-query%22[datanucleus-jdo-query]およびhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.apache.maven.plugins%22%20AND%20a%3A%22maven-compiler- plugin%22[maven-compiler-plugin。]


5.2. 注釈処理を有効にする

Eclipseでは、注釈付き処理を有効にするために以下のステップに従うことができます。


  1. Java Compiler

    に進み、コンパイラの準拠レベルが

1.8以上


Java Compiler→Annotation Processing

に移動して、プロジェクトを有効にします。

特定の設定と注釈処理の有効化


Javaコンパイラ→注釈処理→ファクトリパス

に移動し、有効にします。

プロジェクト固有の設定をクリックしてから、リストに以下のjarを追加します。

上記の準備は、永続クラスをコンパイルするときはいつでも、datanucleus-jdo-query.jarのアノテーションプロセッサが

@PersistenceCapable.

によってアノテーションを付けられた各クラスに対してクエリクラスを生成することを意味します

この場合、プロセッサは

QProductItem

クラスを生成します。生成されたクラスは、先頭にQが付いていても、永続クラスとほぼ同じ名前です。


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

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

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


6. SQL

RDBMSを使用している場合、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<ProductItem> results = query.executeList();

クエリを実行するときに

ProductItem

オブジェクトを取得するために、クエリに

setClass()

を使用しました。それ以外の場合は、

Object

タイプを取得します。


7. JPQL

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

JPQLを使用してクエリを作成しましょう。

Query query = pm.newQuery("JPQL","select i from "
  + "com.baeldung.jdo.query.ProductItem i where i.price < 10"
  + " and i.status = 'InStock'");
List<ProductItem> results = (List<ProductItem>) query.execute();

ここでのエンティティ名は

com.baeldung.jdo.query.ProductItemです。クラス名だけを使用することはできません。これは、JDOがJPAのようなエンティティ名を定義するためのメタデータを持っていないためです。


.


ProductItem


p

を定義した後、

P



ProductItem.

を参照するための別名として使用できます。

JPQL構文の詳細については、http://www.datanucleus.org/products/accessplatform

5

1/jpa/getting__started.html[link]を参照してください。


8結論

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

この記事のコード例はhttps://github.com/eugenp/tutorials/tree/master/libraries-data[GitHubについて]で見つけることができます。