Hibernate 休眠条件和计数列

Hibernate 休眠条件和计数列,hibernate,count,subquery,hibernate-criteria,Hibernate,Count,Subquery,Hibernate Criteria,我试图返回一个实体,该实体的列具有另一个一对多关系表的计数。我想使用hibernate标准,而不是HQL来实现这一点 select p.*, (select count(*) from child where child.parentid = p.id) as LEVELS from parent p 你可以通过某种投影来实现 请参见有关Hibernate投影的说明。您可能对子查询类中的sqlProjection方法感兴趣 List results = session.createCriter

我试图返回一个实体,该实体的列具有另一个一对多关系表的计数。我想使用hibernate标准,而不是HQL来实现这一点

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

你可以通过某种投影来实现

请参见有关Hibernate投影的说明。您可能对子查询类中的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();

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


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

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

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

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

where子句应该是from吗?谢谢修复了语法错误,我将尝试一下,但无论如何都不能使用原始sql,而是以某种方式使用分离查询吗?棘手的部分似乎是,您的计数取决于另一个关系。如果使用Hibernate映射,然后,您可以映射子对象的列表,只需使用Java大小方法。有关关联方法,请参阅我的其他答案。原始项目为我提供了select*from select count*from BADGELVELS bl,其中bl.badgeid=b.id来自CISCO.BADGES this_uu,其中this_uu.ACTIVE=?在何处rownum如何从Parent.class返回剩余列的计数?我是否缺少投影?我正在返回一个家长列表,我不想返回该对象的所有join Child。我只需要父列的子列的计数。
    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();