2012-07-24 35 views
0

我的问题是相同的确切问题是这样的SO question休眠部分填充对象与投影

假设我们有实体一样

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

有了个createCriteria的帮助下,我们正在试图获得ID预测,名字来自用户和城市从地址表。

我们遇到的问题是,城市没有被设置为解决对象城市属性。

这是我们试图代码:

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评论,但如果我授权这样做,我怎么能实现呢?任何输入将不胜感激。

回答

2

使用AliasToBeanConstructorResultTransformer,并定义像在实体以下构造:

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

或者,(这是我的首选解决方案,因为它避免了反射并允许风险较小重构代码)不“T使用任何结果变压器和自己构建您的实例:

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); 
}  
+0

谢谢@JB Nizet。我会尝试可能是第二种方法。 – kosa 2012-07-24 17:30:09

+0

在做这个解决方案时,我最终陷入了奇怪的境地。其中一个问题是,我的标准有时候会填充城市,有时候是邮编,有时候也是。该标准部分将是if/else情况。在这种情况下,如何使用Object []来确定我的查询是否正在使用ZIPCODE(或)CITY(或)BOTH?任何输入将不胜感激。 – kosa 2012-07-25 21:58:17

+0

如果你知道要查询什么,你也应该知道要填充什么。简单的'if'块应该这样做。你也可以有三个“Populator”实例,并在方法开始时创建合适的实例。 – 2012-07-26 05:53:46

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类

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

添加制定者addressCity没有必要提及的是,员工的构造,也应该实例地址对象。