簡體   English   中英

Hibernate Criteria:計算最新的條目,按屬性分組

[英]Hibernate Criteria: counting the most recent entries, grouped per attribute

這是一個我很難解開的結。

我的要求是使用Criteria API。

我有一個Team類定義如下:

@Entity
@Table(name="TEAMS")
public class Team{

    private Set<State> states = new HashSet<State>();

    @OneToMany(cascade=CascadeType.ALL, orphanRemoval=true, mappedBy="team")
    public Set<State> getStates() {
        return states;
    }
}

Team有一個State列表,因為它在其生命周期中通過不同的狀態。 所以State類定義如下。

@Entity
@Table(name="STATES")
public class State{

    private Team team;
    private StateType type;
    private Date date;

    @ManyToOne
    @JoinColumn(name="TEAM_ID")
    public Team getTeam() {
        return team;
    }

    @Column(name="STATE_TYPE")
    public StateType getType() {
        return type;
    }

    @Temporal(TemporalType.DATE)
    @Column(name="DATE")
    public Date getDate() {
        return date;
    }
}

現在,我想要的是計算當前處於給定狀態的團隊數量。 當前狀態是具有最新date值的狀態。

我嘗試了以下聲明,但沒有運氣。

public Long getStateTypeNumber(StateType type)
{
    Session session = sessionFactory.getCurrentSession();
    Criteria criteria = session.createCriteria(State.class);
    criteria.add(Restrictions.eq("type", type));
    criteria.addOrder(Order.desc("date"));
    criteria.setProjection(Projections.distinct(Projections.property("team")));
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    criteria.setProjection(Projections.rowCount());
    return (Long) criteria.uniqueResult();
}

誰能提供一些幫助? 謝謝。

好吧,從我看到你錯過了你的Team加入。 但我會嘗試從Team加入你的State班級。

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(Team.class);
criteria.createAlias("states", state);
criteria.add(Restrictions.eq("state.type", type));
criteria.setProjection(Projections.rowCount());
(Long) criteria.uniqueResult();

沒有測試它,因為我沒有環境,希望它有效。

我在下面寫了我找到的解決這個問題的方法。 首先,我必須檢索包含按團隊分組的最新狀態行的State表的視圖,然后我必須為該type添加限制。 這里的技巧是生成一個帶有DetachedCriteria的子查詢,以便在Criteria (感謝@Jan指出它)。

public Long getStateTypeNumber(StateType type)
{   
    DetachedCriteria maxDateQuery = DetachedCriteria.forClass(State.class);     
    maxDateQuery.setProjection(Projections.projectionList().
            add(Projections.max("date")).
            add(Projections.groupProperty("team")));

    Session session = sessionFactory.getCurrentSession();
    Criteria criteria = session.createCriteria(State.class);
    criteria.add(Subqueries.propertiesIn(new String[] {"date", "team"}, maxDateQuery));
    criteria.add(Restrictions.eq("type", type));
    criteria.setProjection(Projections.rowCount());
    return (Long) criteria.uniqueResult();      
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM