休眠标准和计数列

时间:2011-02-19 19:10:13

标签: hibernate count subquery hibernate-criteria

我正在尝试返回一个实体,其列具有另一个表的计数,该表是一对多关系。我想使用hibernate标准,而不是HQL。

select p.*, (select count(*) from child where child.parentid = p.id) as LEVELS
from parent p

4 个答案:

答案 0 :(得分:5)

如果父实体还包含子项列表(双向关联),则可以使用条件返回子项数,如下所示:

    Criteria criteria = hibernateSessionHelper.getSessionFactory().getCurrentSession().createCriteria(Parent.class);

    ProjectionList projList = Projections.projectionList();
    projList.add(Projections.countDistinct("children.id"));
    projList.add(Property.forName("field1").group());
    projList.add(Property.forName("field2").group());
    projList.add(Property.forName("field3").group());
    .
    .
    .
    criteria.createAlias("children", "children", CriteriaSpecification.LEFT_JOIN);

    criteria.setProjection(projList);

    List<Object[]> results = crit.list();

答案 1 :(得分:1)

这样做是有用的。不是很有活力,但它会起作用。

    @Basic
    @Column(name = "LEVEL")
    @Formula(value="(SELECT count(*) FROM BadgeLevels bl WHERE bl.badgeid = this_.id)")
        public long getLevel() {
        return level;
    }

答案 2 :(得分:0)

你可以通过某种投射来做到这一点。

请参阅有关Hibernate预测的tutorial。您可能对Projections类中用于子查询的sqlProjection方法感兴趣。

List results = session.createCriteria(Parent.class, "p") 
    .setProjection(Projections.projectionList()
        .add(Projections.property("field1"))
        .add(Projections.property("field2"))
        .add(Projections.property("field3"))
        .add(Projections.sqlProjection("select count(*) from child where child.parentid = p.id"), new String[] {"LEVELS"}, new Type[] {Hibernate.INTEGER})
    ).list();

答案 3 :(得分:0)

定义如下所示的对象字段映射。然后,当您查询Parent对象时,每个对象都应该有一个名为children的类型列表字段,您可以在其上调用size

<class name="Person">
    <id name="id" column="id">
        <generator class="native"/>
    </id>
    <set name="children">
        <key column="parentId" 
            not-null="true"/>
        <one-to-many class="Child"/>
    </set>
</class>

<class name="Child">
    <id name="id" column="childId">
        <generator class="native"/>
    </id>
</class>