Criteria APIの利用 (4/6)
作成:2017-10-28 10:10
更新:2017-10-28 10:10
更新:2017-10-28 10:10
■Predicateの作成
CriteriaBuilderに用意されている演算のためのメソッド類は、基本的に第1引数に「Predicate」というクラスのインスタンスが渡されます。
Predicateクラスは、エンティティのプロパティ(サンプルのMyDataEntityクラスならば、idやnameなどのことです)を指定するためのものです。これは一体、どうやって用意するのでしょう?
このPredicateは、Rootの「get」と、「as」という2つのメソッドを組み合わせて作成をします。こんな感じです。
getメソッドは、引数に項目の名前を指定し、Pathクラスというもののインスタンスを作成します。asはそのPathのメソッドで、特定のタイプのclassを指定することでPredicateインスタンスを返します。
例えば、MyDataEntityのidを指定する場合を考えてみましょう。これは名前はid、タイプはIntegerです。ということは、このidを示すPredicateインスタンスは以下のように作成すればいいことになります。
これを、CriteriaBuilderのメソッドの引数に指定すればいいのです。では、実際の利用例を挙げておきましょう。
下のリストは、パラメータfindで渡したテキストでnameを検索し、その結果を表示するサーブレットのdoGetメソッドです。例えば、
こんな具合にアクセスをすると、nameに「hanako」を含むものが得られる、というわけです。ここでは、CriteriaBuilderクラスのlikeメソッドを使って絞り込みを行なっています。
このように実行していますね。whereの中でbuilder.likeメソッドを呼び出しています。この第1引数に、root.get().as()でPredicateを設定し、第2引数にはfindパラメータの値を設定してあります。これにより、likeでnameからfindの値を含むものを取得するようになります。
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の値を含むものを取得するようになります。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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入門」に戻る