1

と の 2 つのエンティティがIssueありIssue_Trackerます。

問題.java:

public class Issue implements Serializable
        {
        private Integer issue_id;
        private String  issue_description;
        private Date issue_raised_date;
        private Set<Issue_Tracker> issueTracker = new HashSet<Issue_Tracker>(0);



        @OneToMany(fetch=FetchType.LAZY, mappedBy="issue_id")
        public Set<Issue_Tracker> getIssueTracker() {
        return issueTracker;
    }

        public void setIssueTracker(Set<Issue_Tracker> issueTracker) {
        this.issueTracker = issueTracker;

Issue_Tracker.java:

public class Issue_Tracker implements Serializable
{  
     private Integer   issue_id;
     private String    tracker_status;
     private Timestamp tracked_time;

両方のテーブルを結合したままにすると、次のようにクエリを使用して次のデータを取得します。

SELECT issues.issue_id,
       issues.issue_description,
       issue_tracker.tracker_status,
       issue_tracker.tracked_time
FROM issues
     LEFT JOIN issue_tracker on issues.issue_id = issue_tracker.issue_id 
     WHERE issues.status = "Escalate To"

出力は

  issue_id  tracker_status      tracked_time
    123     Assigned           1/8/2013 11:44   //1st entry
    123     Assigned           1/9/2013 11:45
    123     Completed          1/10/2013 12:52  // last entry

    32      Assigned           1/9/2013 16:46   //1st entry

    32      Assigned           1/10/2013 18:46  //last entry

    33      Assigned           1/9/2013 16:47   //1st entry

    33      Cancel             1/9/2013 17:49  //last entry

基準を使用してこれらの結合を行うと、これらの結果が得られます

      issue_id  tracker_status      tracked_time
        123     Assigned           1/8/2013 11:44 //1st entry of issue_id 123
        32      Assigned           1/9/2013 16:46
        33      Assigned           1/9/2013 16:47

次の基準を使用して

         Criteria criteria = session.createCriteria(Issue.class);
         criteria.setFirstResult(from);
         criteria.setMaxResults(size);
         criteria.setFetchMode("Issue.issueTracker",FetchMode.JOIN);
         criteria.add(Restrictions.eq("status", "Escalate To"));

現在、期待される出力は

      issue_id  tracker_status      tracked_time
        123     Completed          1/10/2013 12:52 // last entry
        32      Assigned           1/10/2013 18:46 //last entry
        33      Cancel             1/9/2013 17:49  //last entry

これを達成する方法、私は過去 3 日間ここで立ち往生しています。どんな助けでも素晴らしいでしょう。1 対多のマッピングを試みているこの行が原因で起こっているのですか?

private Set<Issue_Tracker> issueTracker = new HashSet<Issue_Tracker>(0);

Setは重複する値を許可しないため、もしそうなら、可能なアプローチは何でしょうか。

4

1 に答える 1

1

これを試して:

SELECT i.issue_id, i.issue_description,
       it.tracker_status, it.tracked_time
FROM issues i 
LEFT JOIN ( SELECT it.issue_id, it.tracker_status, it.tracked_time 
            FROM issue_tracker it 
            INNER JOIN (SELECT issue_id, MAX(tracked_time) tracked_time 
                        FROM issue_tracker GROUP BY issue_id
                       ) A ON it.issue_id = A.issue_id AND it.tracked_time = A.tracked_time 
          ) it ON i.issue_id = it.issue_id 
WHERE i.status = "Escalate To";
于 2013-01-12T10:49:29.997 に答える