【问题标题】:Hibernate Criteria and Count Column休眠条件和计数列
【发布时间】:2011-06-30 11:45:20
【问题描述】:

我正在尝试返回一个实体,该实体的列具有另一个表的计数,该表是一对多关系。我想使用休眠条件而不是 HQL 来执行此操作。

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

【问题讨论】:

  • 你的“where”子句应该是“from”吗?
  • 感谢修复语法错误

标签: hibernate count subquery hibernate-criteria


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    让它工作。不是很动态,但它会起作用。

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

    【讨论】:

      【解决方案3】:

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

      <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>
      

      【讨论】:

      • 我正在返回一个父级列表,我不想返回该对象的所有连接子级。我只想要父列的子节点数。
      【解决方案4】:

      你也许可以通过某种投影来做到这一点。

      请参阅 tutorial 上的 Hibernate 投影。您可能对子查询的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();
      

      【讨论】:

      • 我将尝试这样做,但无论如何不要使用原始 sql,而是以某种方式使用分离查询?
      • 棘手的部分似乎是,您的count 取决于另一个关系。如果您使用 Hibernate Association 映射,那么您可以映射一个 Child 对象列表,而只需使用 Java size 方法。
      • 查看我的其他关于关联方法的答案。
      • 那个原始项目给了我 select * from (select select count(*) from badgelevels bl where bl.badgeid = b.id from CISCO.BADGES this_ where this_.ACTIVE=? ) where rownum
      • 如何从 Parent.class 中返回剩余的列以及计数?我错过了投影吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 2019-02-19
      • 2011-07-14
      • 2012-06-27
      • 2010-12-23
      • 2011-02-27
      相关资源
      最近更新 更多