自分で作ったり提供したりするものは、まず自分自身で使ってみろろということです。自分じゃ使わないものなら人はいくらでも無責任にも無思考にもなれる。そういう投げやりな「サービス」やら「プロダクツ」なんて、だれだってイヤだ。自分が作り手と同時に利用者の立場になれば、ちゃんと使えるレベルのものを提供しようとします。

2010年5月11日火曜日

JDOクエリ(JDOQL)

JDO には一連の条件を満たすオブジェクトを取得するためのクエリ言語が含まれます。JDOQL と呼ばれるこの言語は、JDO データ クラスとフィールドを直接参照することができます。また、クエリ パラメータと結果の種類のチェック機能も備えています。JDOQL は SQL に似ていますが、App Engine データストアのようなオブジェクト指向のデータベースには SQL よりも適しています(App Engine データストアは、JDO インターフェースでの SQL クエリはサポートしていません)。

クエリ API は複数のコール スタイルをサポートしています。JDOQL 文字列の構文を使用すれば、文字列の中に完全なクエリを記述することができます。また、クエリ オブジェクトのメソッドをコールし、クエリの一部またはすべてを指定できます。

メソッド スタイルのコールを使用したクエリの簡単な例を紹介します。この例では、フィルタで使用される値に対してパラメータの置き換えを行い、フィルタを 1 つ、並び替え順序を 1 つ指定します。クエリ オブジェクトの execute() メソッドは、クエリにおいて代用される値と共に宣言順にコールされます。

import java.util.List;
import javax.jdo.Query;

// ...

    Query query = pm.newQuery(Employee.class);
    query.setFilter("lastName == lastNameParam");
    query.setOrdering("hireDate desc");
    query.declareParameters("String lastNameParam");

    try {
        List<Employee> results = (List<Employee>) query.execute("Smith");
        if (results.iterator().hasNext()) {
            for (Employee e : results) {
                // ...
            }
        } else {
            // ... no results ...
        }
    } finally {
        query.closeAll();
    }

文字列構文を使用した同一のクエリを示します。
    Query query = pm.newQuery("select from Employee " +
                              "where lastName == lastNameParam " +
                              "order by hireDate desc " +
                              "parameters String lastNameParam")

    List<Employee> results = (List<Employee>) query.execute("Smith");

クエリの定義ではこれらのスタイルを混在させることができます。次に例を示します。
    Query query = pm.newQuery(Employee.class,
                              "lastName == lastNameParam order by hireDate desc");
    query.declareParameters("String lastNameParam");

    List<Employee> results = (List<Employee>) query.execute("Smith");

execute() メソッドを複数回コールすることで、単一のクエリ インスタンスのパラメータに対して異なる値を代用して再利用できます。各コールはクエリを実行し、結果をコレクションとして返します。

JDOQL 字列構文は、文字列の中のリテラル値を文字列値または数値としてサポートしています。文字列をシングル クォート(')またはダブルクォート(")のいずれかで囲みます。すべての値型はパラメータ代用を使用しなければなりません。文字列のリテラル値を使用した例を次に示します。
    Query query = pm.newQuery(Employee.class, "lastName == 'Smith' order by hireDate desc");

0 件のコメント:

コメントを投稿

ホームページ