2016-04-01 15 views
2

SQL sonucunu düz nesneye eşlemek mümkün mü? Davam CustomerDetailsView yılındaDüz bir sonuç kümesini Hazırda bekletme kullanılarak nasıl dönüştürülür

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

düz bir yapıya sahiptir. Ama ben böyle itiraz eşlemek gerekir:

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

ve

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

cevap

4

Evet bu mümkün. Bunun için özel bir transformatör kullanabilirsiniz: FluentHibernateResultTransformer.

Macun kodunu kopyalayabilir veya jar'i Maven: fluent-hibernate-core'a ekleyebilirsiniz.

Criteria ürününü Projections ile kullanmanız gerekir. , HQL ile kullanma projeksiyon takma adları (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(); 

belirtmek unutmayın

iç içe geçmiş adlar izin vermez Hibernate'in çünkü HQL ile kullanmak mümkün değildir HQL

select addressDetails.countryCode as addressDetails.countryCode

O addressDetails.countryCode takma adla bir hata olacaktır. doğal bir SQL

transformatör ile kullanılması

iç içe çıkıntı (karşı HQL) ile yerli bir SQL için kullanılabilir. Bu durumda tırnak içine alma işleminin kullanılması gerekir:

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

Çok hızlı yanıt için çok teşekkürler. Bu ihtiyacım olduğunu düşündüm. –

+0

Awesome, ancak bu, bir Set , Çocuk alt virüsü genişletme gibi bir nesne için çalışmıyor ve yalnızca belirli bir çocuk alanı istiyorsa, ebeveynin bu tür özniteliklere sahip olmadığı bir istisna atar; miras. Buna bir çözüm var mı? –

+0

@hocikto Çalışmalı. Muhtemelen sizin setiniz 'Child' değil' Ana Baba'ya sahiptir. Bu böyle değilse, bir örnek ile bir sorun ekleyebilirsiniz https://github.com/v-ladynev/fluent-hibernate/issues –

İlgili konular