libro
www.tuyano.com
初心者のためのJava Persistence API入門

Criteria APIの利用 (4/6)

作成:2017-10-28 10:10
更新:2017-10-28 10:10

■Predicateの作成

CriteriaBuilderに用意されている演算のためのメソッド類は、基本的に第1引数に「Predicate」というクラスのインスタンスが渡されます。

Predicateクラスは、エンティティのプロパティ(サンプルのMyDataEntityクラスならば、idやnameなどのことです)を指定するためのものです。これは一体、どうやって用意するのでしょう?

このPredicateは、Rootの「get」と、「as」という2つのメソッドを組み合わせて作成をします。こんな感じです。
root.get( 名前 ).as( タイプ.class)

getメソッドは、引数に項目の名前を指定し、Pathクラスというもののインスタンスを作成します。asはそのPathのメソッドで、特定のタイプのclassを指定することでPredicateインスタンスを返します。

例えば、MyDataEntityのidを指定する場合を考えてみましょう。これは名前はid、タイプはIntegerです。ということは、このidを示すPredicateインスタンスは以下のように作成すればいいことになります。
root.get("id").as(Integer.class)

これを、CriteriaBuilderのメソッドの引数に指定すればいいのです。では、実際の利用例を挙げておきましょう。

下のリストは、パラメータfindで渡したテキストでnameを検索し、その結果を表示するサーブレットのdoGetメソッドです。例えば、
http://localhost:8080/hello?find=hanako

こんな具合にアクセスをすると、nameに「hanako」を含むものが得られる、というわけです。ここでは、CriteriaBuilderクラスのlikeメソッドを使って絞り込みを行なっています。
criteria_query.select(root).where(builder.like(root.get("name").as(String.class), find));

このように実行していますね。whereの中でbuilder.likeメソッドを呼び出しています。この第1引数に、root.get().as()でPredicateを設定し、第2引数にはfindパラメータの値を設定してあります。これにより、likeでnameからfindの値を含むものを取得するようになります。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

// ※サーブレットに追記
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

@Override
protected void doGet(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException {
    String find = request.getParameter("find");
    find = "%" + find + "%";
    EntityManager manager = factory.createEntityManager();
    CriteriaBuilder builder = manager.getCriteriaBuilder();
    CriteriaQuery<MyDataEntity> criteria_query =
            builder.createQuery(MyDataEntity.class);
    Root<MyDataEntity> root = criteria_query.from(MyDataEntity.class);
    criteria_query.select(root)
        .where(builder.like(root.get("name").as(String.class), find));
    Query query = manager.createQuery(criteria_query);
    List list = query.getResultList();
    request.setAttribute("list", list);
    RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
    dispatcher.forward(request,response);
}

※関連コンテンツ

「初心者のためのJava Persistence API入門」に戻る