知っていることと知っていないことの差は大きい
以前、複数のEntityクラスのフィールドを集めるJPQL文を書くのに苦労しました。今回のgetBasketItemsメソッドがまさにそのような例です。当メソッドで説明したようにNEWが使えると知る前は、次のようなコーディングをしていました。NEWを知っていたならこんな苦労はしていなかったでしょう。知っていればなんてことはない処理も、知らなければ苦痛でしかありません。読者の皆さまからJPQLはこのようにすればもっと簡単に書けるというようなコメントをいただき、よりよいサンプルコードに成長させることができればと思っています。
001:List basketItemContents = new ArrayList();
002:// userIdは固定で「tomoharu」を設定
003:Query query = entityManager.createQuery(
004: "SELECT bi.id, m.name, m.price, bi.quantity " +
005: "FROM BasketItem AS bi INNER JOIN bi.meigara AS m, " +
006: "Basket AS b " +
007: "WHERE b.userId = :userId")
008: .setParameter("userId", "tomoharu");
009:List resultList = query.getResultList();
010:BasketItemContent basketItemContent = null;
011:for (int i = 0; i < resultList.size(); i++) {
012: Object[] oList = resultList.get(i);
013: for (int k = 0; k < oList.length; k++) {
014: System.out.println("oList[" + k +"] = " + oList[k]);
015: }
016: basketItemContent = new BasketItemContent();
017: basketItemContent.setId(((Integer)oList[0]).intValue());
018: basketItemContent.setName((String)oList[1]);
019: basketItemContent.setPrice(((Integer)oList[2]).intValue());
020: basketItemContent.setQuantity(((Integer)oList[3]).intValue());
021: basketItemContents.add(basketItemContent);
022:}
023:return basketItemContents;
おさらい
今回説明したことをおさらいします。
- Entityクラス間のディレクションとカーディナリティを整理しました
- Entityクラス間の関連の指定の仕方を説明しました
- JPQLを使って複数のEntityから値を取得する方法や、更新する方法を説明しました
今回のJava EEプロジェクトのフォルダ構成は図6の通りです。説明したクラスやServlet、JSPはサンプルコードとしてページトップに置いているので、ダウンロードしてご使用ください。また、MySQLのリストア用SQLファイルも添付しています。1から構築するのが面倒な場合はMySQL Workbenchでリストアしてご使用ください。

