@Formula рассчитывать на ManyToMany - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь добавить поле подсчета лайков для своей сущности 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;

1 Ответ

1 голос
/ 24 апреля 2019

Ваша проблема связана с синтаксической ошибкой в ​​hibernate @Formula, поэтому позвольте мне подробно объяснить, когда вы помещаете запрос в формулу, в Hibernate добавляется подзапрос, когда при поиске песни выполняется следующий запрос, например:

ВЫБЕРИТЕ идентификатор, имя, автора, содержание, (ВЫБЕРИТЕ COUNT (i.id) ОТ user_likes_song i WHERE song_id = i.id) в качестве формулы ОТ ....

тогда вам нужно добавить круглые скобки ( ) в ваш подзапрос.

@Formula("(SELECT COUNT(i.id) FROM user_likes_song i WHERE song_id = i.id)")
private long likeCount;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...