1

私の質問は、このSO questionとまったく同じ問題です。

次のようなエンティティがあるとします

public class Employee {
    Long getId();
    String getName();
    Address getAddress();  
}

createCriteria と Projections の助けを借りて、ユーザーから ID、名前、住所テーブルから都市を取得しようとしています。

私たちが抱えている問題は、city がオブジェクトの city プロパティに対応するように設定されていないことです。

試したコードは次のとおりです。

 Criteria cr = session.createCriteria(Employee.class)
                    .setProjection(Projections.projectionList()
                    .add(Projections.property("id"), "id")
                    .add(Projections.property("Name"), "Name")
                    .add(Projections.property("address.city"), "address.city"))
                    .addOrder(Order.asc("address.city"))
                    .createAlias("address", "address")
                    .setResultTransformer(Transformers.aliasToBean(Employee.class));

上記の質問に対するコメントに基づいてJBNizet、部分的にオブジェクトが悪い考えであることを理解しましたが、それを行うことが義務付けられている場合、どうすればそれを達成できますか? 任意の入力をいただければ幸いです。

4

2 に答える 2

3

AliasToBeanConstructorResultTransformerを使用して、エンティティで次のようなコンストラクターを定義します。

public Employee(Long id, String name, String city) {
    this.id = id;
    this.name = name;
    this.address = new Address();
    this.address.setCity(city);
}

または(リフレクションを回避し、リスクを抑えてコードをリファクタリングできるため、これが私の推奨されるソリューションです)、結果トランスフォーマーを使用せず、インスタンスを自分で構築します。

List<Object[]> rows = criteria.list();
List<Employee> result = new ArrayList<Employee>(rows.size());
for (Object[] row : rows) {
    Employee e = new Employee();
    e.setId((Long) row[0]);
    e.setName((String) row[1]);
    Address address = new Address();
    address.setCity((String) row[2]);
    e.setAddress(address);
    result.add(e);
}    
于 2012-07-24T16:42:48.073 に答える