【问题标题】:get updated row in one to many mapping using hibernate使用休眠在一对多映射中获取更新的行
【发布时间】:2013-01-10 10:17:00
【问题描述】:

我有两个实体 Issue 和 Issue_Tracker。我在一对多映射中加入了这两个表。在 Issue_Tracker 中,我们可以有多个条目,例如

  issue_id  tracker_status      tracked_time
    123     Assigned           1/8/2013 11:44
    123     Assigned           1/8/2013 11:45
    123     Completed          1/8/2013 11:52
    32      Assigned           1/9/2013 16:46
    33      Assigned           1/9/2013 16:47
    33      Cancel             1/9/2013 16:49 

我想通过 tracked_time 订购 Issue_tracker 实体,因此我只能获得最后一次更新tracker_status。我正在使用标准来获取数据,但是我得到了第一个条目,例如:对于 issue_id 123,我将 tracker_status 设置为已分配,但我想为 id 123 获取tracker_status : Completed。如何实现这一点。我的DAO如下

     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"));
      return criteria.list();

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

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

我希望你们能得到我想问的问题,有什么帮助吗?

【问题讨论】:

    标签: java hibernate struts2 hibernate-mapping hibernate-criteria


    【解决方案1】:

    向映射的集合添加@OrderBy 注解。这应该返回按跟踪时间排序的集合中的实体。集合中的第一个实体应该是最新的。

    //Issue.java
        @OneToMany(fetch=FetchType.LAZY, mappedBy="issue_id")
        @OrderBy("tracked_time DESC")
        public Set<Issue_Tracker> getIssueTracker() {
        return issueTracker;
    

    你也可以试试:

     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"));
     Criteria subCriteria = criteria.createCriteria("issueTracker");
     subCriteria.addOrder(Order.desc("tracked_time"));
     return criteria.list();
    

    【讨论】:

    • 谢谢,但没有工作得到这个错误 java.lang.ClassNotFoundException: antlr.TokenStream
    • 应用程序库中缺少一个 jar 文件:findjar.com/class/antlr/TokenStream.html
    • 好的,已执行但没有真正的变化,我得到相同的结果,仍然获取第一行,而不是最后一行
    • @arvin_codeHunk 我可能错过了您想要完成的任务。我的第一个解决方案将导致调用 getIssueTracker 返回一个有序集。我认为您试图订购父母,请查看其他解决方案。警告它未经测试
    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多