web-dev-qa-db-ja.com

JPA、エンティティマネージャー、多くの列を選択し、結果リストのカスタムオブジェクトを取得

クエリの下の結果のように、カスタムオブジェクトのリストを取得する方法:

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

例で:

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();

カテゴリIDとカテゴリ内の製品数を含むマップが必要です。

16
Piotr Kozlowski

残念ながら、JPAはMapで結果を取得する標準的な方法を提供していません。ただし、結果リストをウォークスルーしてマップを手動で作成するのは簡単です。

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

Hibernate(tagged)を使用していると仮定すると、以下のHQLクエリを試すことができますが、テストしていません。

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