0

私はしばらくこれに苦労しているので、誰かが私に何らかのガイダンスを与えることができることを願っています. 私は2つのテーブルを持っています:

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

これは機能していません。結果のクエリを見ると、必要な Visit を持つレコードの Maximum ではなく、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
        )

私は他のアプローチを試しましたが、私が探している解決策にはなりません。アドバイス、ガイダンスをいただければ幸いです。

4

1 に答える 1

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 の方がはるかに読みやすいです。

于 2012-11-26T22:34:23.537 に答える