使用hibernate在一对多的映射中获得更新的行 [英] get updated row in one to many mapping using hibernate

查看:122
本文介绍了使用hibernate在一对多的映射中获得更新的行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个实体Issue和 Issue_Tracker 。我已经以一对多的方式加入了这张桌子。在 Issue_Tracker 中,我们可以有多个条目,如



  issue_id tracker_status tracked_time 
123分配2013/1/8 11:44
123分配2013/1/8 11:45
123已完成1 / 8/2013 11:52
32已分配2013/1/9 16:46
33已分配2013/1/9 16:47
33取消1/9/2013 16:49

我想通过tracked_time来订购Issue_tracker实体,这样我只能得到最后一次更新 tracker_status 。我使用条件来获取数据,但是我得到第一个条目,例如:对于issue_id 123,我将tracker_status设为Assigned,但是我想要获取 tracker_status:Completed 为id 123.如何实现这一点。我的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


$ b $公共类的问题实现Serializable
{
私人整数issue_id;
private String issue_description;
私人日期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


$ b $公共类Issue_Tracker实现了Serializable
{
private Integer issue_id;
私人字符串tracker_status;
私人时间戳记tracked_time;

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

解决方案

将@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));
标准subCriteria = criteria.createCriteria(issueTracker);
subCriteria.addOrder(Order.desc(tracked_time));
return criteria.list();


I have two entities Issue and Issue_Tracker. I have joined both table in an one to many mapping. In Issue_Tracker , We can have multiple entries like

  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 

I want to Order the Issue_tracker entity by tracked_time so I can get only last update tracker_status.I am using criteria to get data,However I am getting first entry for example : for issue_id 123, I get tracker_status as Assigned , But I want to fetch tracker_status : Completed for id 123. How to achieve this. My DAO is as follows

     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;

I hope you guys can get what i am trying to ask, any help?

解决方案

Add an @OrderBy annotation to the mapped collection. This should return the entities in the set ordered by the tracked time. The first entity in the set should be the latest.

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

You may also want to try:

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

这篇关于使用hibernate在一对多的映射中获得更新的行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆