JPA @Query для подсчета количества связей, которые имеет каждый объект

#java #spring #postgresql #hibernate #jpa

#java #весна #postgresql #спящий режим #jpa

Вопрос:

Я пытался получить запрос внутри таблицы соединений для работы отношения «многие ко многим». Запрос предназначался для подсчета того, сколько пользователей следят за конкретной игрой. Сама сущность очень проста, выглядит примерно так:

 @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

 

Любая помощь будет признательна.

Комментарии:

1. Я считаю, что group by f.GameID — это правильный путь

Ответ №1:

Похоже, вам нужно использовать join в вашем запросе, например

 @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);
 

Ответ №2:

  1. Вы пытаетесь сопоставить пару (game_id, count) со всем game_entity, который имеет другую структуру, поэтому генерируемый sql-запрос не соответствует вашим ожиданиям.
  2. Что, вероятно, может вам помочь, так это сопоставление результата вашего запроса с DTO.
  3. Каждый раз, когда у вас возникает подобная проблема, я бы рекомендовал взглянуть на SQL-запрос, который генерирует JPA. Смотрите, например, https://www.baeldung.com/sql-logging-spring-boot