1 対多の関係である別のテーブルのカウントを持つ列を持つエンティティを返そうとしています。HQLではなく、休止状態の基準を使用してこれを行いたいです。
select p.*, (select count(*) from child where child.parentid = p.id) as LEVELS
from parent p
1 対多の関係である別のテーブルのカウントを持つ列を持つエンティティを返そうとしています。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;
}
以下のようにオブジェクト フィールド マッピングを定義します。次に、親オブジェクトを照会すると、各オブジェクトには、呼び出すことができる 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>
ある種の投影によってそれを行うことができるかもしれません。
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();