我已经为此苦苦挣扎了一段时间,所以我希望有人能给我一些指导。我有两张 table :
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
)
我尝试过其他方法,但都没有得到我正在寻找的解决方案。 任何建议、指导表示赞赏。
最佳答案
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 更具可读性。
关于java - Hibernate 投影以查找列表中的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13573825/