left - listar datos con hibernate
¿Cómo recuperar solo ciertos campos de una entidad en JPQL o HQL? ¿Cuál es el equivalente de ResultSet en JPQL o HQL? (3)
En HQL puede usar la función list () para obtener una lista de la matriz Object [] que contiene filas de resultados:
Query query = session.createQuery("select c.id,c.name from Category c");
List<Object[]> rows = query.list();
en la matriz devuelta el elemento 1 st será id, second - name.
for (Object[] row: rows) {
System.out.println(" ------------------- ");
System.out.println("id: " + row[0]);
System.out.println("name: " + row[1]);
}
Si desea utilizar la API de criterios de hibernación, debe usar las Projections .
Con JPA funcionará de la misma manera:
List<Object[]> rows = entityManager.createQuery(queryString).getResultList();
En JPQL, puedo recuperar entidades por:
query = entityManager.createQuery("select c from Category c");
List<Category> categories = query.getResultList();
Pero, si deseo recuperar los campos de identificación y nombre (solo) de la entidad de Categoría, necesito algo como el objeto ResultSet
, a través del cual puedo decir: rs.getString("name")
y rs.getString("id")
. ¿Cómo hacer esto a través de JPQL
, sin recuperar toda la entidad?
Básicamente, para obtener información sobre cómo recuperar información de una consulta como: select c.id,c.name from Category c
?
No es el uso de la función .list()
lo que hace que el resultado sea una List<Object[]>
. Es la especificación de los campos ( c.id, c.name
) en la consulta HQL. Si tu consulta es
"select c from Category c"
Luego, query.list()
devolverá un objeto List<Category>
.
También puedes mapear directamente a la clase.
public class UserData {
private String name;
private Date dob;
private String password;
//setter
}
public UserData getUserData() {
String queryString = "select user.name as name, user.dob as dob, user.userses.password as password from UserProfile user where user.userEmailId=''[email protected]''";
Query query = sessionFactory.getCurrentSession().createQuery(queryString);
query.setResultTransformer(Transformers.aliasToBean(UserData.class));
return query.uniqueResult();
}