Para la lectura existen varios métodos de la clase Session:
- get(Class,Serializable), al que le deberemos pasar la clase que queremos leer y su clave primaria.
- load(Class, Serializable) acepta un objeto Class, y cargará el estado de una nueva instancia de esa clase, inicializada en estado persistente.
private static void leer(int id) throws Exception {
session = instancia.abrir();
Transaction transaction=session.beginTransaction();
PersonasEntity persona = session.load(PersonasEntity.class, id);
// PersonasEntity persona = session.get(PersonasEntity.class, id); // Esta línea también funcionaría como la anterior
System.out.println(persona.getNombre());
transaction.commit();
instancia.cerrar();
}
Para sentencias SQL, también se pueden usar varios métodos:
- createQuery
- createNamedQuery
- createNativeQuery
- createSQLQuery
createQuery
Método usado para crear consultas dinámicas, las cuales están definidas directamente mediante un String. Por ejemplo:
public List findWithName(String name) {
return em.createQuery(
"SELECT c FROM Customer c WHERE c.name LIKE :custName")
.setParameter("custName", name)
.setMaxResults(10)
.getResultList();
}
Este método permite usar lenguaje HQL. Por ejemplo:
public List findWithName(String name) {
return em.createQuery(
"FROM Customer c WHERE c.name LIKE :custName")
.setParameter("custName", name)
.setMaxResults(10)
.getResultList();
}
createNamedQuery
Método usado para crear consultas estáticas o consultas que usan anotación javax.persistence.NamedQuery. El elemento name de @NamedQuery especifica el nombre de la consulta que será usada mediante el método createNamedQuery. La consulta en sí de @NamedQuery estára especificada en query:
@NamedQuery(
name="findAllCustomersWithName",
query="SELECT c FROM Customer c WHERE c.name LIKE :custName"
)
Para acceder a este método, se realiza una llamada al nombre de la consulta:
@PersistenceContext
public EntityManager em;
...
customers = em.createNamedQuery("findAllCustomersWithName")
.setParameter("custName", "Smith")
.getResultList();
createNativeQuery y createSQLQuery
Permite ejecutar consultas con código SQL nativo.
sesion.createSQLQuery("SELECT * FROM PersonasEntity WHERE idPersona=6").iterate();
sesion.createNativeQuery("SELECT * FROM PersonasEntity WHERE idPersona=6").iterate();
Los tipos de consulta SQL más básicas para obtener una lista de escalares (valores) son los siguientes:
sess.createNativeQuery("SELECT * FROM Personas").list();
entityManager.createNativeQuery("SELECT ID,NOMBRE, EDAD FROM PERSONAS FROM Personas" ).getResultList();
Estas retornarán una lista de objetos arrays (Object[]) con valores escalares para cada columna en la tabla PERSONAS. Hibernate utilizará ResultSetMetadata para deducir el orden real y los tipos de los valores escalares retornados.
Otro tipo de consulta más compleja, es la consulta de entidades. Para obtener los objetos entidades desde una consulta sql nativa, se utiliza por medio de addEntity().
sess.createNativeQuery("SELECT * FROM PERSONAS").addEntity(Persona.class).list;
entityManager.createNativeQuery("SELECT * FROM PERSONAS", Persona.class).getResultList();