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