返回Java JPA中的映射?

返回Java JPA中的映射?,java,mysql,jpa,Java,Mysql,Jpa,我有一个名为rating的表,如下所示: id | score | article_id 分数可以是1到5 我想用一个查询返回得分为5s、4s、3s、2s、1的数量。因为我不想为此任务运行5个查询。 如果查询可以返回如下映射,则会很方便: 关键是1到5的分数 该分数对应的数字的值 有没有办法(或类似的方法)实现这一点? 我正在使用Java JPA、MySQL 5.x创建返回类型为Object[]的普通查询,如下所示: Query Query=entityManager.createQuer

我有一个名为rating的表,如下所示:

id | score | article_id
分数可以是1到5

我想用一个查询返回得分为5s、4s、3s、2s、1的数量。因为我不想为此任务运行5个查询。 如果查询可以返回如下映射,则会很方便:

  • 关键是1到5的分数

  • 该分数对应的数字的值

有没有办法(或类似的方法)实现这一点?
我正在使用Java JPA、MySQL 5.x创建返回类型为Object[]的普通查询,如下所示:

Query Query=entityManager.createQuery(“根据r.score从评级r组中选择计数(r)、r.score”)

然后:
List results=query.getResultList()

您可以对其进行迭代,并从
结果[0]
结果[1]

创建返回类型为Object[]的普通查询,如:

Query Query=entityManager.createQuery(“根据r.score从评级r组中选择计数(r)、r.score”)

然后:
List results=query.getResultList()

您可以对其进行迭代,并从
结果[0]
结果[1]

获取结果。下面是一个使用
标准查询的解决方案:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Object[]> query = cb.createQuery(Object[].class);
Root<Rating> rating = query.from(Rating.class);
query.multiselect(rating.get("score"), cb.count(rating)).groupBy(rating.get("score"));

List<Object[]> results = em.createQuery(query).getResultList();
System.out.println("score | count\n-----------");
for(Object[] object : results){
    System.out.println(object[0] + " | " + object[1]);
}
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(对象[].class);
Root rating=query.from(rating.class);
query.multiselect(rating.get(“score”)、cb.count(rating)).groupBy(rating.get(“score”);
List results=em.createQuery(query.getResultList();
System.out.println(“score | count\n------------”;
对于(对象[]对象:结果){
System.out.println(对象[0]+“|”+对象[1]);
}

这假设您的评级实体类的名称为
评级

,下面是一个使用
标准查询
的解决方案:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Object[]> query = cb.createQuery(Object[].class);
Root<Rating> rating = query.from(Rating.class);
query.multiselect(rating.get("score"), cb.count(rating)).groupBy(rating.get("score"));

List<Object[]> results = em.createQuery(query).getResultList();
System.out.println("score | count\n-----------");
for(Object[] object : results){
    System.out.println(object[0] + " | " + object[1]);
}
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(对象[].class);
Root rating=query.from(rating.class);
query.multiselect(rating.get(“score”)、cb.count(rating)).groupBy(rating.get(“score”);
List results=em.createQuery(query.getResultList();
System.out.println(“score | count\n------------”;
对于(对象[]对象:结果){
System.out.println(对象[0]+“|”+对象[1]);
}

这假设您的评级实体类的名称是
rating

您使用的是哪个JPA实现?在JPA中,没有标准的方法将映射作为结果类型返回。但是,它可能作为特定于提供商的功能提供。例如,EclipseLink确实支持它-
query.setHint(QueryHints.RESULT\u TYPE,ResultType.Map)。我在Play框架中使用JPA实现,该框架使用Hibernate的实现。我认为您必须满足于
列表
查询结果。如果您愿意,您可以将其转换为
地图
,但只需5个键,我认为没有必要。给出的任何一个答案都应该适合您。您使用的是哪个JPA实现?在JPA中,没有标准的方法将映射作为结果类型返回。但是,它可能作为特定于提供商的功能提供。例如,EclipseLink确实支持它-
query.setHint(QueryHints.RESULT\u TYPE,ResultType.Map)。我在Play框架中使用JPA实现,该框架使用Hibernate的实现。我认为您必须满足于
列表
查询结果。如果您愿意,您可以将其转换为
地图
,但只需5个键,我认为没有必要。给出的任何一个答案都应该适合你。