2012-03-30 17 views
0

でコレクション内の要素の最大数を取得します私は、次の2つのエンティティ(1:N):持ってJPQL

@Entity 
public class Job { 

@ManyToOne 
private User user 

} 

@Entity 
public class User { 

@OneToMany 
private Collection<Job> jobs; 

} 

を今私はJPQL名前付きクエリを作成したいですほとんどのジョブを持つユーザーを取得します。

ジョブエンティティに関する次の問合せでは、各ユーザーのジョブ数を取得できますが、何らかの理由で、そのジョブの最大ジョブ数を持つユーザーのジョブ数と比較する必要がありますすべての...

@NamedQuery(query="SELECT j.user, COUNT(j) FROM Job j GROUP BY j.user") 

私の第二のアイデアは、Userエンティティで名前付きクエリを記述することです:

@NamedQuery(query="SELECT u.username FROM User u WHERE SIZE(u.jobs) = MAX ??????") 
ここ

もiが最大割り当てられたジョブの数を取得する方法がわかりません。.. ..

誰かが私を助けることができますか?

答えて

0

ジョブサイズによってユーザ注文を一覧表示するには、あなたがJQL以下使用することができますが:

HSQLDBとHibernateを使用して、次のSQLを生成し
from User order by jobs.size desc 

select 
    user0_.id as id0_ 
from 
    User user0_ 
order by 
    (select 
     count(jobs1_.user_id) 
    from 
     Job jobs1_ 
    where 
     user0_.id=jobs1_.user_id) desc 

の最大ジョブサイズを確認するにはユーザーは、HSQLDBの次のSQLを生成したクエリのTypedQuery.setMaxResults(1)を使用して、ほとんどのジョブでトップユーザーのみをリストするJPAを制限することができます。

select 
    user0_.id as id0_ 
from 
    User user0_ 
order by 
    (select 
     count(jobs1_.user_id) 
    from 
     Job jobs1_ 
    where 
     user0_.id=jobs1_.user_id) desc limit ? 
0

私は、彼らが持っているジョブの数の多い順に私のユーザーのリストを与え、正常次のようなクエリを見つけました:

SELECT u FROM User u LEFT JOIN FETCH u.jobs 
ORDER BY u.jobs.size DESC 

次に、あなただけの最初の結果を取得する場合、あなたはなりますユーザーに最大ジョブ数を取得させる。それはあなたが望んだことですか?また

、あなたが使用できるジョブの最大数を持つすべてのユーザーを取得する:

SELECT u FROM User u LEFT JOIN FETCH u.jobs 
WHERE u.jobs.size = (SELECT max(jobs.size) FROM User) 

をあなたはおそらくLEFT JOIN FETCH一部に

を必要としません
関連する問題