2016-04-01 5 views
2

SQLの結果をフラットなオブジェクトにマップすることは可能ですか?私の場合はHibernateを使用してフラットな結果セットを変換する方法

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を使用する必要があります。 、HQLを使用して投影エイリアス(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

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

素晴らしいですが、これはSet 、オブジェクトChildがParentを継承し、Childの特定のフィールドだけを必要とする場合、親がそのような属性を持たないという例外をスローします。継承。これに対する解決策はありますか? –

+0

@hociktoうまくいくはずです。おそらくあなたのセットには 'Child'ではなく' Parent'があります。そうでない場合は、https://github.com/v-ladynev/fluent-hibernate/issues –

関連する問題