Я пытаюсь добавить поле подсчета лайков для своей сущности Song, но получаю синтаксические ошибки, так как не очень хорошо разбираюсь в SQL.
Моя система лайков работает, но мне бы хотелосьдля отображения количества в представлении песни.Он должен подсчитывать, сколько раз идентификатор песни появляется в таблице «user_likes_song».
ОШИБКА: синтаксическая ошибка в позиции «SELECT» или около нее: 295
Аннотация формулы:
@Entity
@Data
@NoArgsConstructor
@Table(name = "song")
public class Song {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, nullable = false, columnDefinition = "serial")
private Long id;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "author", nullable = false)
private String author;
@Column(name = "content", nullable = false)
private String content;
@Formula("SELECT COUNT(i.id) FROM user_likes_song i WHERE song_id = i.id")
private long likeCount;
@ManyToOne
@JoinColumn(name = "band_id", nullable = false)
private Band band;
Таблицы:
CREATE TABLE IF NOT EXISTS user_acc (
id SERIAL NOT NULL PRIMARY KEY,
username text NOT NULL UNIQUE,
password text NOT NULL,
first_name text NULL,
last_name text NULL,
age INT NULL,
phone text NULL,
email text NOT NULL UNIQUE,
status active_status NOT NULL DEFAULT 'active',
create_date TIMESTAMP without TIME ZONE DEFAULT now() NOT NULL,
update_date TIMESTAMP without TIME ZONE DEFAULT now() NOT NULL
);
-- -----------------------------------------------------
-- Table song
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS song (
id SERIAL NOT NULL PRIMARY KEY,
name text NOT NULL,
author text NULL,
content text NOT NULL,
status song_status NOT NULL DEFAULT 'inactive',
create_date TIMESTAMP without TIME ZONE DEFAULT now() NOT NULL,
update_date TIMESTAMP without TIME ZONE DEFAULT now() NOT NULL,
band_id integer NOT NULL,
user_id integer NOT NULL,
CONSTRAINT fk_song_band
FOREIGN KEY (band_id)
REFERENCES band (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_song_user1
FOREIGN KEY (user_id)
REFERENCES user_acc (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
-- -----------------------------------------------------
-- Table user likes song
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS user_likes_song (
id SERIAL NOT NULL PRIMARY KEY,
user_id integer NOT NULL,
song_id integer NOT NULL,
CONSTRAINT fk_user_likes_song_user1
FOREIGN KEY (user_id)
REFERENCES user_acc (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_user_likes_song_song1
FOREIGN KEY (song_id)
REFERENCES song (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
Редактировать:
Исправлено путем добавления скобок и объединения таблиц:
@Formula("(SELECT COUNT(s.id) FROM user_acc u INNER JOIN user_likes_song us on u.id = us.user_id " +
"INNER JOIN song s on us.song_id = s.id WHERE us.song_id = s.id )")
private Long likeCount;