2017-12-15 5 views
0

와 JPQL 쿼리를 작성하는?어떻게`COUNT` 및 <code>COUNT</code> 및 <code>GROUP BY</code>로 <strong>JPQL</strong> 쿼리를 작성하고 <code>Map<Integer,Integer></code> 같은 결과를 얻을 방법`GROUP BY`

public class CommentEntity { 

private int id; 

private int parentId; 

private EntityParentType parentType; 

private Long replyCounts; 

private String author; 

private String comment; 

} 

. 쿼리가 실패입니다

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

enter image description here

하지만 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); 

} 

public enum EntityParentType { 

PERSON, 
EVENT, 
COMMENT; 

} 

나는 MySQL을 쿼리 및 미세이 작품을 썼다.

@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.IncorrectResultSizeDataAccessException' exception. 
result returns more than one elements 

도 실패합니다.

Method threw 'org.springframework.dao.InvalidDataAccessApiUsageException' exception. 
No aliases found in result tuple! Make sure your query defines aliases! 

나는 CommentEntity에 pacakge를 추가 시도도

+0

예외에 따라 여러 결과 (목록)가 있습니다. 그러나 선언 한 메소드에는지도 인스턴스가 하나만 있습니다. – pvpkiran

+0

목록 >도 실패합니다. 별칭이 없습니다. –

답변

1

한 가지 해결 방법은 다음과 같이 생성자 구문을 사용하는 것입니다 실패 할 수 있습니다 : 당신은 장소에서 다른 클래스를 사용할 수 있습니다, 물론

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

ImmutablePair (예 : Map.MapEntry의 구체적인 구현). 그런 다음 결과를 List<ImmutablePair>으로 선언하고 결과를 서비스 메소드의 맵에 수집합니다.

+0

값이 'key'및 'value'의 올바른 순서로 설정됩니다. –

+0

물론 가능합니다. 위 쿼리는 JPA에게 'ImmutablePair'의 생성자를 호출하도록 지시하고, Java에서 생성자 매개 변수의 순서가 중요합니다. – crizzis

+0

이해합니다. 고맙습니다. –

관련 문제