简体   繁体   English

使用条件仅获取最后一个条目(休眠)

[英]fetch only last entries using criteria(Hibernate)

I have two entities Issue and Issue_Tracker . 我有两个实体IssueIssue_Tracker

Issue.java: Issue.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: Issue_Tracker.java:

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

when i left join both the table and i get following data as follows using query: 当我离开连接表和我得到以下数据使用查询如下:

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"

and output is 和输出是

  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

Now when i did these join using criteria, I get these results 现在,当我使用条件进行这些加入时,我得到了这些结果

      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

using following criteria 使用以下条件

         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"));

Now expected output is 现在预期的输出是

      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

How to achieve this, I am stuck here since last three days, any help would be great, is it happening because of this line where i am trying one to many mapping 如何实现这一点,自最近三天以来我一直在这里,任何帮助都会很大,是因为我尝试一对多映射的这一行而发生了吗?

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

because a Set does not allow duplicate values, if so what would be the possible approach. 因为Set不允许重复值,如果可以,那么可能的方法是什么。

Try this: 尝试这个:

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";

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM