Java 休眠条件:计算最近的条目,按属性分组

Java 休眠条件:计算最近的条目,按属性分组,java,hibernate,criteria,hibernate-criteria,Java,Hibernate,Criteria,Hibernate Criteria,这个结我觉得很难解开 我的要求是使用标准API 我有一个团队类,定义如下: @Entity @Table(name="TEAMS") public class Team{ private Set<State> states = new HashSet<State>(); @OneToMany(cascade=CascadeType.ALL, orphanRemoval=true, mappedBy="team") public Set<S

这个结我觉得很难解开

我的要求是使用标准API

我有一个团队类,定义如下:

@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;
    }
}
现在,我想计算当前处于给定状态的团队数量。当前状态是具有最新日期值的状态

我试着用下面的语句,但没有成功

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

有人能提供一些帮助吗?谢谢。

从我所看到的情况来看,你错过了加入你的团队的机会。但我会尝试从团队中加入你们的国家队


我没有测试它,因为我没有环境,希望它能工作。

我在下面写下我找到的解决方案。 首先,我必须检索状态表的视图,其中包含按团队分组的最新状态行,然后我必须为该类型添加限制。这里的技巧是使用DetachedCriteria生成一个子查询,以在条件中使用,这要感谢@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();      
}

谢谢你的回答。这里的问题是,它仍然缺少对最新状态类型的选择。对于每个团队,我需要找到最新的状态类型,然后我必须计算这些状态类型的数量。哦,对不起,我现在得到了您想要的。这对你有帮助吗?
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();
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();      
}