web-dev-qa-db-fra.com

JPA, Entity Manager, sélectionnez de nombreuses colonnes et obtenez la liste des résultats des objets personnalisés

Comment puis-je obtenir la liste des objets personnalisés, comme les résultats ci-dessous:

SELECT p.category.id, count(p.id) FROM Product p left join p.category c WHERE p.seller.id=:id GROUP BY c.id

Par exemple:

return getEntityManager().createQuery("SELECT p.category.id, count(p.id) FROM Product p left join p.category c WHERE p.seller.id=:id GROUP BY c.id").setParameter("id", id).getResultList();

J'ai besoin d'une carte avec l'identifiant de la catégorie et le nombre de produits dans la catégorie.

16
Piotr Kozlowski

Malheureusement, JPA ne fournit pas de méthode standard pour récupérer les résultats dans un Map. Cependant, construire votre carte manuellement en parcourant la liste des résultats est assez simple:

TypedQuery<Object[]> q = getEntityManager().createQuery(
    "SELECT c.id, count(p.id) " +
    "FROM Product p LEFT JOIN p.category c " +
    "WHERE p.seller.id = :id " +
    "GROUP BY c.id", Object[].class).setParameter("id", id);

List<Object[]> resultList = q.getResultList();
Map<String, Long> resultMap = new HashMap<String, Long>(resultList.size());
for (Object[] result : resultList)
  resultMap.put((String)result[0], (Long)result[1]);
34
DannyMo

En supposant que vous utilisez hibernate (étiqueté), vous pouvez essayer la requête HQL ci-dessous, je n'ai pas testé.

SELECT new map(p.category.id as category_id, count(p.id) as id_count) FROM Product p left join p.category c WHERE p.seller.id=:id GROUP BY c.id

3
Nayan Wadekar