18

如何获取自定义对象列表,例如以下查询的结果:

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 和类别中产品数量的地图。

4

3 回答 3

37

不幸的是,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]);
于 2013-06-19T22:28:17.200 回答
3

假设你使用的是 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

于 2013-06-20T09:18:57.233 回答
-1

使用 JPA 2.0 和 EclipseLink 实现

对于第一个问题:自定义对象列表(无表对象):

答案:创建一个自定义模型并使用@Entity 和@Id

@Entity
public class QueryModelDTO implements Serializable{ 
    @Id
    private Integer categoryId;
    private int count;
    ---gets and sets
}

创建查询并执行

QueryModelDTO qm = (QueryModelDTO) em.createQuery(
                "SELECT p.category.id as categoryId, count(p.id) as count FROM Product p
                left join p.category c WHERE p.seller.id=:id 
                GROUP BY c.id",QueryModelDTO.class)
                .setParameter("id", id).getSingleResult();

第二个:如何阅读地图上的响应

答案:使用 QueryHints 和 ResultTypes(这是@DannyMo 答案的一种变体)

Query q  = em.createNativeQuery("SELECT * FROM Foo f");
q.setHint(QueryHints.RESULT_TYPE, ResultType.Map);
List<Map> lm = q.getResultList();
    for (Map map : lm) {
        for (Object entry : map.entrySet()) {
            Map.Entry<DatabaseField, Object> e = (Map.Entry<DatabaseField, Object>) entry;
            DatabaseField key = e.getKey();
            Object value = e.getValue();
            log.debug(key+"="+value);
        }            
    }

我希望这有帮助

于 2015-03-07T02:09:03.203 回答