| JBoss EJB 3.0と拡張機能
EJBクエリーによるデータベース検索
はじめに
| EJB 3.0 `EntityManager`インタフェースは、EJBクエリー言語 (EJB QL: EJB Query Language)として知られるSQLライクなクエリー言語をサポートします。それはデータベースの検索とその結果をエンティティBeanインスタンスとして返すことを目的とします。伝統的なSQLと比較すると、EJB QLはサポートされるすべてのデータベース間でポータブルで、かつオブジェクト指向環境で適切に動作します。
テーブルから全データを取得
| 以前のトレイルでは、投資計算アプリケーションでデータベース内で利用可能な投資会社(fund)と投資家(investor)が、名前と主キーを含む形でドロップダウンリストに表示されることを述べました。その計算プログラムの最下部にはデータベースから過去の計算記録のリストもあります。(しかし)、データベースからそれらのデータを取得する方法については議論しませんでした。 実際のところ、EJB QLを使って、あるテーブルからすべての行を取得することはとても簡単です。次のコード片は`Fund`テーブルからすべての投資会社(fund)を取得する方法を示します。それはSQLをご存知の方にはとても簡単に理解できるものです。`EntityManager.createQuery()`はEJB QL文を使ってクエリーを生成します。`listResults()`メソッドはそのクエリーにマッチするエンティティBeanのコレクションを返します。
    @Stateless
    public class QueryCalculator implements Calculator {

      @PersistenceContext
      protected EntityManager em;

      public Collection <Fund> getFunds () {
        return em.createQuery("from Fund f").getResultList();
      }

      // ... ...
    }
次のコードは`TimedRecord`テーブルの行の完全なリストを取得する方法を示します。結果はリストの最初にもっとも最近の記録が返されます。
    @Stateless
    public class QueryCalculator implements Calculator {

      @PersistenceContext
      protected EntityManager em;

      // ... ...

      public Collection <TimedRecord> getRecords () {
        return em.createQuery(
          "from TimedRecord r order by r.ts desc").getResultList();
      }

      // ... ...
    }
上のコードが動く様子を見るためには、以下のボタンを叩いて前回のトレイルのサンプルアプリケーションを試してみて下さい。
データベース検索
| もちろん、EJB QLを使ってデータベースを検索することも可能です。次の例では、`result`属性の値が特定の範囲に収まるようなすべての`TimedRecord`を検索します。EJB QL文はJDBC prepared statementのようにパラメタ化できることに注意してください。クエリー中のパラメタはアプリケーションによって動的に設定されます。
    @Stateless
    public class QueryCalculator implements Calculator {

      @PersistenceContext
      protected EntityManager em;

      // ... ...

      public Collection <TimedRecord> filterRecords (double low, double high) {
        return em.createQuery(
            "from TimedRecord r where r.result > :low AND r.result < :high")
            .setParameter ("low", new Double (low))
            .setParameter ("high", new Double (high))
            .getResultList();
      }

    }
次のボタンをクリックして検索アプリケーションを試してください。
ソースコード参照
| 検索アプリケーションのセッションBean Calculator.java はステートレスセッションBeanインタフェースです QueryCalculatorBean.java はデータベース検索を実行するセッションBean実装です 検索アプリケーションのJSPユーザインタフェース filter.jsp
まとめ
| このトレイルでは、データベースに格納されたエンティティBeanのクエリーと取得の方法を学びました。次のトレイルでは、別のデータベース操作である、データの更新とオブジェクトモデルをデータベースと同期させることを扱います。