2017-06-11 21 views
0

私は、休止状態の "Post"と "Comment"エンティティの間にOne To Manyリレーションシップを持っています。 1つの投稿多くのコメント(投稿)1 - N(コメント)を持つことができるので、コメントは投稿する外部キー(post_id)を保持します。私のコントローラー用のポストリストを取得しているときに、各ポストにはこのポストに割り当てられたCOMMENTSの数も含めたいと思っています。だからいくつかの投稿リストがあれば、私はその投稿の下のコメントのデータ番号に添付したいと思います。などspring + Hibernateで1から数えられた行まで

しかし、ここで、どのように私は実際に多くのコメントを取得する必要があり、

私はコメントの数を保持することができ、追加のフィールドでPostWithCommentsCountDTOを作成しました、私がやったのコンバータ私は実際にそれをどのように行うことができますか? PostWithCommentsCountDTO - - PostService - PostRepository - 投稿 コントローラ - CommentDTO - CommentService - CommentRepository -

全体のアーキテクチャは、この コントローラのように見えますコメント

+0

他の任意の関連するコードを含め、問題を再現するのに役立つ十分な情報を記載してください。これを参考にしてください:https://stackoverflow.com/help/how-to-ask –

答えて

1

あなたはPostWithCommentsCountDTOためのすべてのフィールドとコンストラクタを作成できる点15.6 here をお読みください。その後、私が追加したリンクに記述されているように、HQLクエリの中で使用することができます。あなたは、あなたが 'post_id'で投稿とコメントに参加し、 'post_id'でグループ化し、selectステートメントでcount(post_id)を使用することができます。 だからあなたのクエリは次のようになります。これは、あなたがリポジトリレベルですでにあなたのDTOを収集することができることを意味し

select new PostWithCommentsCountDTO (p.id, /and all other fields.../ , count(post_id)) from Post as p left join Comments as c on p.id=c.post_id where /some where statement if needed .../ group by c.post_id 

public List<PostWithCommentsCountDTO> getWithCommentsCount(...){ 
    return (List<PostWithCommentsCountDTO>) getSession().createQuery(...).setParameter(...).list(); 
} 
+0

はエンティティを返さなければならないと聞いたので、リポジトリから「悪い習慣」を返さないのですか? –

+0

@Rickmoriarty 'getAll(...)'、 'getById(...)'などの一般的なメソッドはエンティティを返すべきですが、テーブルのすべてのデータを必要としないメソッドDTOを使用する。 –

+0

@Rickmoriartyたとえば、DBからすべての注文を受け取り、それらをサービスレイヤーにグループ化する場合、商品のすべての名前と数をいくつかの注文表から選択する必要があります。DBから不必要なデータをたくさん取得する必要があります。メソッドの実行。あなたのDBがあなたのアプリケーションと同じマシンにない場合、実行時間は長くなり、アプリケーションは遅くなります。しかし、DBサーバーでは単純に 'group by ...'と 'count(...) 'を行い、DBから集約されたデータだけを取得することができます。 –

関連する問題