hibernate - left - hql join two tables
Hibernate HQL createQuery() list() escribe elenco para modelar directamente (2)
Cuando uso list () de Hibernate (HQL) después de createQuery (), entonces quiero escribir directamente la List<Object[]>
molde List<Object[]>
a mi List<POJO class>
. Describo mi escenario real aquí. Tengo 3 Plain Old Java Objects dice Persona, Operación y Proyecto y una tabla dice Transacción con referencias externas a Persona, Operación y Proyecto.
class Person {
String name;
// getters and setters
}
class Operation {
String name;
// getters and setters
}
class Project {
String name;
// getters and setters
}
class Transaction {
String p_id;
String o_id;
String project_id;
// refers to id of All three table above
}
Ahora, quiero ejecutar una consulta de Hibernate Query Language decir String query="select p.name, o.name, project.name from Person p , Operation o, Project project , Transaction t where p.id=2 and p.id=t.p_id and o.id=t.o_id and project.id=t.project_id"
.
Creé una clase de modelo para el resultado de esta consulta, dice POP_Model.
private class POP_Model {
String person_name;
String operation_name;
String project_name;
}
Ahora, quiero usar la consulta de Hibernate:
Session session=HibernateConnection.getSessionFactory().openSession();
Query q=session.createQuery(query);
List<POP_Model> list=(List<POP_Model>)q.list();
Proporciona un error de tipo de letra que indica que Object [] no se puede convertir a POP_Model. Revisé TypedQuery pero no obtuve un ejemplo para eso. Pero hasta donde yo sé, TypedQuery se puede usar para mapear POJO no Modelo. Quiero escribir directamente el molde a Modelo.
Primero crea un constructor en la clase POJO.
private class POP_Model {
String person_name;
String operation_name;
String project_name;
public POP_Model(String person_name, String operation_name, String project_name){
this.person_name = person_name;
this.operation_name = operation_name;
this.project_name = project_name;
}
}
Entonces puedes usar
select new com.server.dtos.POP_Model(p.name, o.name, project.name)
from Transaction t INNER JOIN t.operation o
INNER JOIN t.person p
INNER JOIN t.project project
where p.id=2
Para referencia, aquí está la documentación oficial . Ir a través de Nuevo objeto con HQL también.
Si está bien con el uso de la API de JPA (que Hibernate también implementa) en lugar de la API de Hibernate para esto, puede usar las consultas de constructor de JPQL:
List<DTO> dtos = entityManager.createQuery("SELECT NEW com.example.DTO( p.name, o.name) FROM Entity o").getResultList();
EDITAR Parece que Hibernate también implementa expresiones de constructor con su API regular:
List<DTO> dtos = session.createQuery("SELECT NEW com.example.DTO( p.name, o.name) FROM Entity o").list();
EDIT2 JPA es un estándar Java EE que unifica el trabajo con diferentes bibliotecas de persistencia como Hibernate y EclipseLink. El tutorial de oráculo es bastante decente.
Puede recuperar un EntityManager en una aplicación no EE como esta:
@PersistenceUnit
private EntityManagerFactory emf;
...
EntityManager em = emf.createEntityManager();