java - example - obteniendo el conjunto de resultados en DTO con SQL Query nativo en Hibernate
sql query hibernate mapping example (1)
Tengo una consulta como a continuación
select f.id, s.name, ss.name
from first f
left join second s on f.id = s.id
left join second ss on f.sId = ss.id
Si pudiera usar HQL, habría utilizado la sintaxis del constructor HQL para completar directamente DTO con el conjunto de resultados. Pero, como hibernate no permite la combinación left sin tener una asociación en su lugar, tengo que usar la consulta SQL nativa.
Actualmente estoy revisando el conjunto de resultados en estilo JDBC y llenando los objetos DTO. ¿Hay alguna manera más simple de lograrlo?
Tal vez podrías usar un transformador de resultados. Citando Hibernate 3.2: Transformers para HQL y SQL :
Transformadores SQL
Con sql nativo que devuelve beans que no son de entidad o Map''s, a menudo es más útil en lugar de
Object[]
básico. Con los transformadores de resultados que ahora es posible.
List resultWithAliasedBean = s.createSQLQuery( "SELECT st.name as studentName, co.description as courseDescription " + "FROM Enrolment e " + "INNER JOIN Student st on e.studentId=st.studentId " + "INNER JOIN Course co on e.courseCode=co.courseCode") .addScalar("studentName") .addScalar("courseDescription") .setResultTransformer( Transformers.aliasToBean(StudentDTO.class)) .list(); StudentDTO dto =(StudentDTO) resultWithAliasedBean.get(0);
Sugerencia: se requieren las llamadas
addScalar()
en HSQLDB para hacer que coincida con un nombre de propiedad, ya que devuelve los nombres de las columnas en mayúsculas (por ejemplo, "NOMBRE DEL ESTUDIANTE"). Esto también podría resolverse con un transformador personalizado que busque los nombres de las propiedades en lugar de usar la coincidencia exacta, tal vez deberíamos proporcionar un método fuzzyAliasToBean ();)
Referencias
- Guía de referencia de Hibernate
- Blog de Hibernate