Jpa 如何使用“COUNT”和“groupby”编写JPQL查询`

Jpa 如何使用“COUNT”和“groupby”编写JPQL查询`,jpa,spring-data-jpa,jpql,Jpa,Spring Data Jpa,Jpql,如何使用COUNT和groupby编写JPQL查询,并将结果作为Map 我写了MySQLquery,这项工作做得很好: SELECT parent_id, COUNT(*) FROM comment AS c WHERE c.parent_type = 2 AND c.parent_id IN (64,65) GROUP BY parent_id 但是JPQL查询失败: @Repository @Transactional(readOnly = true) public interface

如何使用
COUNT
groupby
编写JPQL查询,并将结果作为
Map

我写了MySQLquery,这项工作做得很好:

SELECT parent_id, COUNT(*) FROM comment AS c WHERE c.parent_type = 2 AND c.parent_id IN (64,65) GROUP BY parent_id

但是JPQL查询失败:

@Repository
@Transactional(readOnly = true)
public interface CommentRepository extends JpaRepository<CommentEntity, Integer> {

 @Query(value = "SELECT c.parentId, COUNT(c.id) FROM CommentEntity AS c WHERE c.parentType = ?1 AND c.parentId IN (?2) GROUP BY c.parentId")
 Map<Integer, Integer> findReplyCountByParentIds(EntityParentType entityParentType, List<Integer> ids);

}
以下也是失败的原因:

@Query(value = "SELECT c.parentId, COUNT (c.id) FROM CommentEntity AS c WHERE c.parentType = ?1 AND c.parentId IN (?2) GROUP BY c.parentId")
 List<Map<Integer, Integer>> findReplyCountByParentIds(EntityParentType entityParentType, List<Integer> ids);

我尝试将
pacakge
添加到CommentEntity,也失败了一个解决方法是使用构造函数语法,如下所示:

SELECT NEW org.apache.commons.lang3.tuple.ImmutablePair(c.parentId, COUNT(c.id)) FROM ...

当然,您可以使用任何其他类来代替
ImmutablePair
(例如
Map.MapEntry
的具体实现)。然后将结果声明为
列表
,并将结果收集到服务方法中的映射中

一种解决方法是使用构造函数语法,如下所示:

SELECT NEW org.apache.commons.lang3.tuple.ImmutablePair(c.parentId, COUNT(c.id)) FROM ...

当然,您可以使用任何其他类来代替
ImmutablePair
(例如
Map.MapEntry
的具体实现)。然后将结果声明为
列表
,并将结果收集到服务方法中的映射中

根据例外情况,有多个结果(列表)。但是您声明的方法只有一个map实例。List也是fail,找不到别名根据异常有多个结果(List)。但是您声明的方法只有一个map实例。List也是fail,找不到别名。是否可以保证值将以正确的顺序“key”和“value”设置?当然可以。上面的查询告诉JPA调用
ImmutablePair
的构造函数,构造函数参数的顺序在Java中很重要。是否有保证将值设置为正确的顺序“key”和“value”?当然有。上面的查询告诉JPA调用
ImmutablePair
的构造函数,构造函数参数的顺序在Java中很重要
@Query(value = "SELECT c.parentId, COUNT (c.id) FROM CommentEntity AS c WHERE c.parentType = ?1 AND c.parentId IN (?2) GROUP BY c.parentId")
 List<Map<Integer, Integer>> findReplyCountByParentIds(EntityParentType entityParentType, List<Integer> ids);
Method threw 'org.springframework.dao.InvalidDataAccessApiUsageException' exception.
No aliases found in result tuple! Make sure your query defines aliases!
SELECT NEW org.apache.commons.lang3.tuple.ImmutablePair(c.parentId, COUNT(c.id)) FROM ...