は、この種の問題に後方あなたのように動作します。 SQLクエリを開始します。
select
count(t.name), t.name
from article a
join article_tags ats
join tag t
where
a.id=ats.article_id
and ats.tag_id = t.id
group by
t.name
order by
count(t.name)
desc;
ことからその後JPQLがすべき多かれ少なかれフォロー:
Hibernate: select tag2_.name as col_0_0_, count(tag2_.name) as col_1_0_ from Article article0_ inner join Tag_Article tags1_ on article0_.id=tags1_.articles_id inner join Tag tag2_ on tags1_.tags_id=tag2_.id group by tag2_.name order by count(tag2_.name) desc
Count of A = 2
Count of B = 1
Count of C = 1
UPDATE:
List<Tuple> t = em.createQuery("select t.name as name, count(t.name) as count from Article a join a.tags t group by (t.name) order by count(t.name) desc", Tuple.class).getResultList();
t.stream().forEach((tp)-> {
System.out.println("Count of " + tp.get("name") + " = " + tp.get("count"));
});
これは私に次のような出力を提供しますあなたがしたい場合タグのリストは、タプルの最初の要素をタグに変更するだけです。あなたは
SELECT t FROM Tag t ORDER BY SIZE(t.articles) ASC
のようなその何かを使用して欲しいものを達成することができます
Hibernate: select tag2_.id as id1_1_, tag2_.name as name2_1_ from Article article0_ inner join Tag_Article tags1_ on article0_.id=tags1_.articles_id inner join Tag tag2_ on tags1_.tags_id=tag2_.id group by tag2_.name order by count(tag2_.name) desc
Tag = A
Tag = B
Tag = C
すべてのタグをグループ化し、カウントと注文降順を取得しますか? –
@Nicholas私はそれらをグループ化したいとは思っていません。私はそれらを記事クラスインスタンス内の出現回数で降順に並べ替えるようにしたいと思います。 – Tim
おそらくどこかに参加テーブルがあるかもしれません。なぜなら、MNを持たない人は少し無意味かもしれないからです。 –