3

次のことを前提としています。

public class Enterprise
{
   private int id;
   private String name;
}
public class Site
{
   private int id;
   private String name;
   private Enterprise enterprise; //@ManyToOne relation
}
public class Area
{
   private int id;
   private String name;
   private Site site; //@ManyToOne relation
}

企業ごとに結果をグループ化する休止状態の基準を使用してクエリを実行したいと思います。

    Criteria criteria = session.createCriteria(Area.class);
    criteria.setProjection(Projections.projectionList()  
                    .add(Property.forName("id").as("id")) 
                    .add(Property.forName("name").as("name"))
        .add(Projections.groupProperty("site.enterprise")))
        .setResultTransformer(Transformers.aliasToBean(Area.class));
/*
 * more conditions
 */
    List<Area> areas = criteria.list();

この休止状態を実行すると、例外が返されます: org.hibernate.QueryException: プロパティを解決できませんでした: site.enterprise ...

これを行うエレガントな方法はありますか。前もって感謝します。

4

1 に答える 1

9

最初にエイリアスを設定する必要があるかもしれません:

criteria.createAlias("site", "s")

そして、次を使用します。

Projections.groupProperty("s.enterprise")

エンティティではなくフィールドでグループ化する必要がある場合もあります。

site.enterprise.name // or id

これには、エイリアスenterpriseも作成する必要がある場合がありますが、必要ない場合もあります。

更新 1:次のような結果になる可能性があります。

Criteria criteria = session.createCriteria(Area.class);
criteria.createAlias("site", "s")
        .createAlias("s.enterprise", "e")
        .setProjection(Projections.projectionList()  
                .add(Property.forName("id").as("id")) 
                .add(Property.forName("name").as("name"))
    .add(Projections.groupProperty("s.e.name")))
    .setResultTransformer(Transformers.aliasToBean(Area.class));

更新 2:私をクレイジーと呼んでくださいが、上記の例から、Hibernate を最大限に活用しないことで、非常に長い道のりを歩んでいる可能性があります。SQL と同じように使用しようとしているようです。Hibernate は、エンティティ、そのフィールド、および関係について既に認識しています。私の目には、これは上記と同等です:

Criteria criteria = session.createCriteria(Area.class);
criteria.createAlias("site", "s")
        .createAlias("s.enterprise", "e")
        .add(Projections.groupProperty("s.e.name"));

// Any other conditions.

List<Area> areas = criteria.list();

現時点でグループ化する理由がわかりません...

于 2013-01-07T09:39:59.377 に答える