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では、注釈付き処理を有効にするために以下のステップに従うことができます。
-
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について]で見つけることができます。