2012-07-24 59 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沒有必要提及的是,員工的構造,也應該實例地址對象。