java - Hibernate 投影以查找列表中的最大值

标签 java hibernate

我已经为此苦苦挣扎了一段时间,所以我希望有人能给我一些指导。我有两张 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/

相关文章:

java - jbpm 6 - 示例 Web 应用程序 "rewards-basic"错误

hibernate - JPA:如何使用HQL检查NULL查询参数值?

java - 如何在 hibernate 中更新多个表?

java - Hibernate映射文件和注解的区别

java获取字符串中的下几个单词

java - next() 和 next().CharAt(0); 之间的区别

java - JTable 中值的求和与乘法

java - 创建类似于java对象层次结构的树

java - 静态方法中的 LazyInitializationException

java - 将数据插入 OpenOffice 数据库