HQLの書き方でよくはまるのでメモ。テーブルではなくあくまでもClassを扱っていることを忘れないようにしないと。
select c,c.categoryId,count(t) from Category c left outer join c.threads as t group by c.categoryId
@ITのフォーラムのような会議室システムの構成をイメージ。Category名及び、その下のスレッドの件数をカウントしたい場合。Categoryクラスのインスタンスから直接SetなりListを取得してsize()を取る方法もあるが、その場合件数を取得するためにThreadクラスのインスタンスまで取得する必要が出てしまうので、こちらの方がよいかと。この場合、Query.list()するとCategoryクラスとcount件数が入った配列のリストが返るので、JSP側でそれを意識して表示すればよいだろう。
<table> <tr> <th width="*">カテゴリ名</th> <th width="10%">スレッド件数</th> </tr> <c:forEach items="${categories}" var="cate"> <tr> <td> <a href="threadIndex.do?categoryId=${cate[0].categoryId}"> <c:out value="${cate[0].categoryNm}"/> </a> </td> <td>${cate[1]}</td> </tr> </c:forEach> </table>