Spring

JPA @Query는 각 객체의 관계 수를 계산합니다.

기록만이살길 2021. 3. 5. 08:03
반응형

JPA @Query는 각 객체의 관계 수를 계산합니다.

1. 질문(문제점):

다 대다 관계 작업을 위해 조인 테이블 내에서 쿼리를 얻으려고 노력했습니다. 이 쿼리는 특정 게임을 팔로우하는 사용자 수를 계산하기위한 것입니다. 엔티티 자체는 다음과 같이 매우 간단합니다.

@Entity
@Table(name = "followed_users_games", uniqueConstraints = {
        @UniqueConstraint(columnNames = "followed_id")
})
public class FollowedEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "followed_id", unique = true, nullable = false)
    private Integer followedId;

    @ManyToOne
    @JoinColumn(name = "game_id")
    private GameEntity games;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private UserEntity users;

    @Column(name = "notify")
    @NonNull private Boolean notify;
}

그리고 내가 실행하려고 시도한 쿼리는 다음과 같습니다.

    @Query("select f.gameId, count(f) as usercount from FollowedEntity f group by f.games.gameId order by usercount desc")
    List<GameEntity> findMostFollowed(Pageable pageable);

내 데이터베이스 자체에서 쿼리를 테스트했는데 제대로 작동하는 것 같습니다. 그러나 내 응용 프로그램은 다음과 같은 오류를 반환합니다.

org.postgresql.util.PSQLException: ERROR: column "gameentity1_.game_id" must appear in the GROUP BY clause or be used in an aggregate function

어떤 도움을 주시면 감사하겠습니다.

2. 해결방안:

다음과 같이 쿼리에 조인을 사용해야하는 것 같습니다.

@Query(value = "SELECT g.gameId, COUNT(g) as usercount FROM FollowedEntity f JOIN f.games g GROUP By g.gameId ORDER BY usercount DESC")
   List<GameEntity> findMostFollowed(Pageable pageable);
65744090
반응형