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入門」に戻る