我正在尝试返回一个实体,该实体的列具有另一个表的计数,该表是一对多关系。我想使用休眠标准而不是 HQL 来做到这一点。
select p.*, (select count(*) from child where child.parentid = p.id) as LEVELS
from parent p
我正在尝试返回一个实体,该实体的列具有另一个表的计数,该表是一对多关系。我想使用休眠标准而不是 HQL 来做到这一点。
select p.*, (select count(*) from child where child.parentid = p.id) as LEVELS
from parent p
如果父实体还包含子实体列表(双向关联),则可以使用条件返回子实体的计数,如下所示:
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();
让它工作。不是很动态,但它会起作用。
@Basic
@Column(name = "LEVEL")
@Formula(value="(SELECT count(*) FROM BadgeLevels bl WHERE bl.badgeid = this_.id)")
public long getLevel() {
return level;
}
你也许可以通过某种投影来做到这一点。
请参阅有关 Hibernate 投影的教程。您可能对子查询的ProjectionssqlProjection
类中的方法感兴趣。
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();
定义一个对象字段映射,如下所示。然后,当您查询 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>