2016-04-01 12 views
2

Ist es möglich, das Ergebnis von SQL einem nicht flachen Objekt zuzuordnen?Wie transformiere ich eine flache Ergebnismenge mit Hibernate?

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

In meinem Fall CustomerDetailsView flache Struktur aufweist. Aber ich brauche es abzubilden, wie dies zum Objekt:

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

und

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; 
} 

Antwort

4

Ja, es ist möglich. Sie können einen benutzerdefinierten Transformator dafür verwenden: FluentHibernateResultTransformer.

Sie können einfügen Code oder fügen Sie das Glas von Maven: fluent-hibernate-core.

Sie müssen Criteria mit Projections verwenden. Bitte vergessen Sie nicht Projektion Aliase angeben (userName, addressDetails.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(); 

mit HQL Mit

Es ist unmöglich, es mit HQL zu verwenden, da der Ruhezustand nicht erlaubt verschachtelte Aliase in

HQL

select addressDetails.countryCode as addressDetails.countryCode

Es wird ein Fehler mit dem addressDetails.countryCode alias sein.

Verwendung mit einem nativen SQL

Der Transformator kann mit den verschachtelten Vorsprüngen (gegenüber HQL) für eine native SQL verwendet werden. Es ist notwendig, die Aliase mit den Anführungszeichen in diesem Fall zu verwenden:

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

Vielen Dank für so schnelle Antwort. Das denke ich brauchte. –

+0

Awesome, aber das funktioniert nicht für Sachen wie wenn Sie ein Set haben , Objekt Child erweitert Parent, und Sie wollen nur bestimmte Feld von Child, es wird eine Ausnahme werfen, dass Eltern nicht über solche Attribute verfügt, es nicht behandelt Erbe. Irgendeine Lösung dafür? –

+0

@hocikto Es sollte funktionieren. Wahrscheinlich hat Ihr Set ein "Eltern" und nicht "Kind". Wenn das nicht ist, können Sie ein Problem mit einem Beispiel hinzufügen https://github.com/v-ladynev/fluent-hibernate/issues –