2012-11-26 32 views
0

我一直在为此苦苦挣扎,所以我希望有人能够给我一些指导。我有两个表格:Hibernate预测在列表中找到最大值

WardTransactions: 
    +-----------+ 
    | Field  | 
    +-----------+ 
    | Id  | 
    | VisitId | 
    | Event  | 
    | EventTime | 
    +-----------+ 

Visits: 
    +---------------+ 
    | Field   | 
    +---------------+ 
    | Id   | 
    | VisitNumber | 
    +---------------+ 

对于每次访问可以有许多WardTransactions。我正在尝试使用Hibernate Criteria/Projections来查找最近的WardTransaction进行特定访问。例如:

public WardTransaction findLast(Visit visit) { 
    DetachedCriteria maxQuery = DetachedCriteria.forClass(WardTransaction.class); 
    maxQuery.setProjection(Projections.max("id")); 
    Criteria query = getSession().createCriteria(WardTransaction.class) 
     .createAlias("visit", "visit") 
     .add(Restrictions.eq("visit.id", visit.getId())) 
     .add(Property.forName("id").eq(maxQuery)); 
    return (WardTransaction) query.uniqueResult(); 
} 

这是行不通的。从查看结果查询看来,它正在使用Max WardTransaction.Id进行内部连接,而不是使用所需访问的记录的最大值。即(修改,以使其更清晰):

select 
     a.Id, 
     a.VisitId, 
     a.Event, 
     a.EventTime, 
     b.Id, 
     b.VisitNumber, 
    from 
     WardTransactions a 
    inner join 
     Visits b 
      on a.VisitId=b.Id 
    where 
     b.Id='22' 
     and a.Id = (
      select 
       max(a.Id) as y0_ 
      from 
       WardTransactions a 
     ) 

我试图在我寻求的解决方案的其他方法,但没有结果。 任何意见,指导赞赏。

回答

1
String hql = "select w from WardTransaction w where w.visit = :visit order by w.id desc"; 
WardTransaction last = session.createQuery(hql) 
           .setParameter("visit", visit); 
           .setMaxResults(1) 
           .uniqueResult(); 

你当然可以用Criteria做同样的事情,但HQL更可读,恕我直言。

+0

完美!谢谢你的快速反应。非常感激! – skyman