1

次のクラス構造が与えられます。

class Job 
{
    String description;
    Collection<JobHistory> history;
}

class JobHistory
{
    Date assignDate;
    User jobOwner;
}

class JobOwner 
{
    String name;
    String id;
}

このクラス構造は、JPA を介してデータベースにアクセスできます。DAO 層では、JPA 構文でクエリを記述できます。

問題:特定の ID を持つ特定の所有者のエントリと、ジョブの最後の所有者Job( assignDate 順) のリストが必要です。非常に複雑に聞こえますが、おそらくもっと単純です。すべてのジョブを指定し、指定された所有者がジョブの実際の所有者です。JobHistoryJobhistoryJobHistory

更新:わかりやすくするために、クラスの名前を少し変更します。

class Job 
{
    String description;
    Collection<JobOwnerHistory> history;
}

class JobOwnerHistory
{
    Date assignDate;
    User jobOwner;
}

class JobOwner 
{
    String name;
    String id;
}

EveryJobには、 でソートされた所有者の履歴がありassignDateます。実際の所有者は、最後に割り当てられたジョブ (つまりMAX(assignDate)) を取得しました。特定のユーザーのJobOwnerHistoryエントリをすべてのジョブで検索したい。MAX(assignDate)User

4

2 に答える 2

2

クエリに対して次の答えが見つかりました。

SELECT j, h FROM Job j JOIN j.history h JOIN h.jobOwner u
WHERE u.name = :name AND 
    (SELECT MAX(h2.assignDate) FROM Job j2 JOIN j2.history h2
     WHERE h2 member of j.history) = h.assignDate

クエリで最も重要な部分はMAX(h2.assignDate)、所有者履歴のジョブと最新のエントリを取得するための副選択です。

于 2009-01-24T05:53:50.027 に答える
1

試す:

SELECT j, j.history FROM Job j JOIN User u WHERE u.name = :name

これを EclipseLink で行う場合は、少し変更します。

public List<Job> getAllJobsForUser(String username) {
  List<Job> jobs = entityManager
    .createQuery("SELECT j FROM Job j JOIN User u WHERE u.name = :name")
    .setParameter("name", username)
    .setHint(QueryHints.BATCH, "j.history")
    .queryForList();
}

違い?最初のバージョンでは 2 つのオブジェクトを返すため、リストまたはオブジェクト配列からそれらを取得する必要がありますが、2 番目のバージョンでは、クエリ ヒントは (想定される) 怠惰な 1 対多の関係からすべてのジョブ履歴をロードするだけです。 .

Hibernate にこれと同等のものがあるかどうかはわかりません。Toplink Essentials はそうではありません。しかし、これは EclipseLink の私のお気に入りの機能の 1 つです。

ああ、明らかに、私が行ったようなアドホック クエリの代わりに名前付きクエリを使用することができます (そしておそらくそうすべきです) (それらはビルド中に検証できるため)。

于 2009-01-14T10:28:36.463 に答える