usar update two tutorialspoint tutorial tables subconsultas sesiones programacion persistencia example ejemplo como cerrar java hibernate hibernate-criteria

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();