1

我的问题与这个SO question完全相同。

假设我们有像这样的实体

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

在 createCriteria 和 Projections 的帮助下,我们尝试从用户和地址表中获取 id、name 和 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 回答
0

你也可以试试这个:

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

并在 Employee 类中为 addressCity 添加设置器

public void setAddressCity( String addressCity ){
    address.setCity(addressCity);
}

不用说Employee的构造函数,也应该实例化Address对象。

于 2016-11-22T08:33:26.143 回答