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

検索アプリケーションのJSPユーザインタフェース

まとめ

このトレイルでは、データベースに格納されたエンティティBeanのクエリーと取得の方法を学びました。次のトレイルでは、別のデータベース操作である、データの更新とオブジェクトモデルをデータベースと同期させることを扱います。