GIG

赴くままに技術を。

JPQLの内部テーブル結合を試してみる

何がしたいか

以下のようなテーブルを全て結合し、任意の検索をしたい。

f:id:hermesian:20130930183227p:plain

JPQLでクエリをかく

最終的に任意のグループIDを条件として、DOC_TBLの情報を取得したい。 以下、2通りで書いてみる。

その① (JOIN ~ ONを利用して結合する)

StringBuilder sb = new StringBuilder();
sb.append("SELECT DISTINCT av.typeId.docId FROM AccessvectorTbl av ");
sb.append("JOIN AccesstypeTbl at ON av.typeId.id = at.id ");
sb.append("JOIN GroupTbl g ON av.gid.id = g.id ");
sb.append("JOIN DocTbl d ON at.docId.id = d.id ");
sb.append("JOIN FolderTbl f ON d.folderId.id = f.id ");
sb.append("WHERE g.id = :groupId");

Query q = em.createQuery(new String(sb));
q.setParameter("groupId", 1L);

List<DocTbl> results = q.getResultList();

その② (JPA側で解決してもらう)

JPAのありがたみがわかるなー

StringBuilder sb = new StringBuilder();
sb.append("SELECT DISTINCT av.typeId.docId FROM AccessvectorTbl av ");
sb.append("JOIN av.gid g ");
sb.append("JOIN av.typeId at ");
sb.append("JOIN at.docId d ");
sb.append("JOIN d.folderId f ");
sb.append("WHERE g.id = :groupId");

Query q = em.createQuery(new String(sb));
q.setParameter("groupId", 1L);

List<DocTbl> results = q.getResultList();

まとめ

JPQLでテーブル結合してみた。 詳細な条件のもと結合したい場合は、ON構文を使う必要がある。 簡易的なテーブル結合であれば、その②の書き方で良いかな。 あと、JPQLだとLEFT JOIN構文はあるけど、RIGHTがないことに注意。 JOIN FETCHも試してみないと。

参考

日本語の記事はあまり見かけないですね。 どこかにまとまっていないかなぁー。