update - programacion hibernate java
Cómo transformar un conjunto de resultados plano usando Hibernate (1)
¿Es posible asignar el resultado de SQL a un objeto no plano?
List<Customer> customers = hibernateSession().createCriteria(CustomerDetailsView.class)
.add(Restrictions.in("userName", userName))
.setProjection(buildProjection())
.setResultTransformer(Transformers.aliasToBean(Customer.class))
.list();
En mi caso, CustomerDetailsView tiene una estructura plana. Pero necesito asignarlo a un objeto como este:
public class Customer {
private String userName;
private String title;
private String firstName;
private String lastName;
private String type;
private String companyName;
private AddressDetails addressDetails;
}
y
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;
}
Sí, es posible. Puede usar un transformador personalizado para ello: FluentHibernateResultTransformer .
Puede copiar el código de pegado o agregar el jar de Maven: fluent-hibernate-core .
Debe usar
Criteria
con
Projections
.
Por favor, no olvide especificar alias de proyección (
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();
Utilizando con HQL
Es imposible usarlo con HQL, porque Hibernate no permite alias anidados en HQL
select addressDetails.countryCode as addressDetails.countryCode
Será un error con el alias
addressDetails.countryCode
.
Usar con un SQL nativo
El transformador se puede usar para un SQL nativo con las proyecciones anidadas (opuestas a HQL). Es necesario usar los alias con las comillas en este caso:
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();