2016-04-01 32 views
2

是否可以將SQL的結果映射到非平面對象?如何使用休眠來轉換平坦結果集

List<Customer> customers = hibernateSession().createCriteria(CustomerDetailsView.class) 
       .add(Restrictions.in("userName", userName)) 
       .setProjection(buildProjection()) 
       .setResultTransformer(Transformers.aliasToBean(Customer.class)) 
       .list(); 

在我的情況CustomerDetailsView具有平面結構。但我需要它映射到對象是這樣的:

public class Customer { 
    private String userName; 
    private String title; 
    private String firstName; 
    private String lastName; 
    private String type; 
    private String companyName; 
    private AddressDetails addressDetails; 
} 

public class AddressDetails { 
    private String countryCode; 
    private String addressLine1; 
    private String zipOrPostCode; 
    private String city; 
    private String countryDivisionName; 
    private String countryDivisionCode; 
    private String countryDivisionTypeCode; 
    private String residentialAddress; 
} 

回答

4

是的,它是可能的。您可以使用自定義變壓器: FluentHibernateResultTransformer

您可以複製粘貼代碼,或添加由Maven提供的jar:fluent-hibernate-core。您需要使用CriteriaProjections。請不要忘記指定投影別名(userNameaddressDetails.countryCode

Criteria criteria = session.createCriteria(Customer.class); 
criteria.createAlias("addressDetails", "addressDetails", JoinType.LEFT_OUTER_JOIN); 

criteria.setProjection(Projections.projectionList() 
     .add(Projections.property("userName").as("userName")) 
     .add(Projections.property("addressDetails.countryCode") 
     .as("addressDetails.countryCode"))); 

List<Customer> customers = criteria.setResultTransformer(
     new FluentHibernateResultTransformer(Customer.class)).list(); 

與HQL使用

這是不可能與HQL使用它,因爲Hibernate的不允許嵌套的別名HQL

select addressDetails.countryCode as addressDetails.countryCode

這將是與addressDetails.countryCode別名錯誤。

與天然SQL

變壓器使用可用於與所述嵌套突起(相對HQL)本機SQL。 在這種情況下需要使用帶引號的別名:

String sql = "select c.f_user_name as userName, d.f_country_code as \"addressDetails.countryCode\" " 
     + "from customers c left outer join address_details d on c.fk_details = d.f_pid"; 

List<Customer> customers = session.createSQLQuery(sql) 
     .setResultTransformer(new FluentHibernateResultTransformer(Customer.class)) 
     .list(); 
+0

非常感謝您的快速響應。這想我需要。 –

+0

太棒了,但這不適用於當你有一個集合,對象Child extends Parent,並且你想要的只是Child的特定字段時,它會拋出一個異常,該父母沒有這樣的屬性,它不處理遺產。任何解決方案? –

+0

@ hocikto它應該工作。可能你的集合有一個「父」而不是「小孩」。如果不是這樣,你可以通過一個例子添加一個問題https://github.com/v-ladynev/fluent-hibernate/issues –