0

次の 2 つのエンティティ (1:N) があります。

@Entity  
public class Job {

@ManyToOne 
private User user

}

@Entity
public class User {

@OneToMany
private Collection<Job> jobs;

}

今、私はjpqlで名前付きクエリを書きたいと思っています。これは、最も多くのジョブを持つユーザーを取得します。

Job Entityに対する次のクエリを使用すると、各ユーザーのジョブ数を取得できます...しかし、どういうわけか、すべてのジョブの最大数を持つユーザーのジョブ数と比較する必要があります...

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

私の 2 番目のアイデアは、User エンティティに名前付きクエリを記述することです。

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

ここでも、最大割り当てジョブ数を取得する方法がわかりません....

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

4

2 に答える 2

0

ジョブ サイズ別にユーザーの順序を一覧表示するには、次の JQL を使用できます。

from User order by jobs.size desc

HSQLDBでHibernateを使用して次のSQLを生成しました:

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

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

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 ?
于 2012-03-31T15:10:14.830 に答える
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おそらくその部分は必要ありません

于 2012-04-16T03:49:24.243 に答える