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

不幸的是,JPA没有提供在Map检索结果的标准方法。 但是,通过遍历结果列表手动构建地图非常简单:

 TypedQuery 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 resultList = q.getResultList(); Map resultMap = new HashMap(resultList.size()); for (Object[] result : resultList) resultMap.put((String)result[0], (Long)result[1]); 

假设你正在使用hibernate(标记),可以尝试下面的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

使用JPA 2.0和EclipseLink impl

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

回答:创建自定义模型并使用@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 lm = q.getResultList(); for (Map map : lm) { for (Object entry : map.entrySet()) { Map.Entry e = (Map.Entry) entry; DatabaseField key = e.getKey(); Object value = e.getValue(); log.debug(key+"="+value); } } 

我希望这有帮助