【问题标题】:Hibernate Criteria: counting the most recent entries, grouped per attributeHibernate Criteria:计算最近的条目,按属性分组
【发布时间】:2015-03-06 10:04:12
【问题描述】:

这是一个我觉得很难解开的结。

我的要求是使用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 有一个States 列表,因为它在其生命周期中会经过不同的状态。所以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();
}

谁能提供一些帮助?谢谢。

【问题讨论】:

    标签: java hibernate criteria hibernate-criteria


    【解决方案1】:

    好吧,据我所知,您在 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();
    

    没有测试它,因为我没有环境,希望它有效。

    【讨论】:

    • 感谢您的回答。这里的问题是它仍然缺少最新状态类型的选择。对于每个 Team,我需要找到最近的状态类型,然后我必须统计这些状态类型的数量。
    • 哦,对不起,我现在得到了你想要的。 this 对你有帮助吗?
    【解决方案2】:

    我在下面写下我为这个问题找到的解决方案。 首先,我必须检索我的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();      
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 2015-09-15
      • 2012-04-09
      相关资源
      最近更新 更多