4

私はこの数週間、春と休止状態を使用してきましたが、そこで常に何か新しいことを学んでいます。

現在、Hibernate の Projections で解決したい問題があります。

モデルPersonがあり、そのモデルには多くの があるとしCarます。以下は、クラス定義が大まかにどのようになるかです:

public class Person implements java.io.Serializable {
    private Integer id;
    private String name;
    private List<Car> cars;
    private Integer minYear; // Transient
    private Integer maxYear; // Transient
}

public class Car implements java.io.Serializable {
    private Integer id;
    private Integer year;
}

ここでの問題は、それぞれのminYear( )を、それらが持っている最も古い年 (最新の年) で埋めたいということです。maxYearPersoncars

後で使用する解決策を見つけましたProjectionsが、つまずいたorg.hibernate.QueryException: could not resolve property: minYear of: model.Personので、db 操作のコードを次に示します。

Criteria criteria = sessionFactory.getCurrentSession().createCriteria("model.Person");
            criteria.add(create(personInstance));
            criteria.createAlias("minYear", "minYear");
            criteria.setProjection(Projections.min("cars.year").as("minYear"));

Projections単純なSQLとHQLの使用をできるだけ避けたいだけなので、一時的な方法で集計値を保存する方法はありますか。

4

1 に答える 1

6

気にしないでください、私は解決策を見つけました。

  1. まず、関連付けられたオブジェクトのエイリアスを次のように作成する必要があります

    Criteria criteria = sessionFactory.getCurrentSession().createCriteria("model.Person");
    criteria.createAlias("cars", "cars");
    
  2. Hibernate Projections を使用して必要なものを選択します

    ProjectionList projections = Projections.projectionList();
    projections.add(Projections.property("id").as("id"));
    projections.add(Projections.property("name").as("name"));
    projections.add(Projections.property("cars").as("cars"));
    
  3. ルート エンティティに基づいて結果をグループ化します (この場合は、その ID、Person.id を使用)。これは特に、集計をグループ化するために集計と共に使用する場合に必要です。

    projections.add(Projections.groupProperty("id"));
    
  4. 集計関数を使用する

    projections.add(Projections.min("cars.year").as("minYear"));
    projections.add(Projections.max("cars.year").as("maxYear"));
    
  5. 投影を設定する

    criteria.setProjection(projections);
    
  6. 結果トランスフォーマーAliasToBeanResultTransformerを使用して、結果フィールド (手順 2 と 4 で指定) を POJO にマップします。

    criteria.setResultTransformer(new AliasToBeanResultTransformer(Person.class));
    
  7. 結果を得る

    List<Person> results = (List<Person>) criteria.list();
    
于 2013-05-26T16:15:38.630 に答える