En JPQL, je peux récupérer des entités en:
query = entityManager.createQuery("select c from Category c");
List<Category> categories = query.getResultList();
Mais si je souhaite récupérer les champs id et name (uniquement) de l'entité Category, j'ai besoin de quelque chose comme l'objet ResultSet
, à travers lequel je peux dire: rs.getString("name")
et rs.getString("id")
. Comment faire cela avec JPQL
, sans récupérer l'entité entière?
Fondamentalement, comment récupérer des informations à partir d’une requête telle que: select c.id,c.name from Category c
?
Dans HQL, vous pouvez utiliser la fonction list () pour obtenir une liste du tableau Object [] contenant les résultats:
Query query = session.createQuery("select c.id,c.name from Category c");
List<Object[]> rows = query.list();
dans le tableau retourné, le premier élément sera id, second - name.
for (Object[] row: rows) {
System.out.println(" ------------------- ");
System.out.println("id: " + row[0]);
System.out.println("name: " + row[1]);
}
Si vous souhaitez utiliser l'API Criteria de hibernate, vous devez utiliser Projections .
Avec JPA, cela fonctionnera de la même manière:
List<Object[]> rows = entityManager.createQuery(queryString).getResultList();
Ce n'est pas l'utilisation de la fonction .list()
elle-même qui rend le résultat List<Object[]>
. C'est la spécification des champs (c.id, c.name
) dans la requête HQL. Si votre requête est
"select c from Category c"
Ensuite, query.list()
renverra un objet List<Category>
.
Vous pouvez également mapper directement à la classe
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();
}