Несколько полей @ElementCollection с дискриминатором?

Я хочу иметь объект Game, в котором есть два списка идентификаторов игроков, хранящихся как Longs.

Это мой стол: game_player_team

game_id player_id команда 1 1 ЧАС 1 2 ЧАС 1 3 А 1 4 А

Вот как далеко я продвинулся в моделировании объекта Game.

Я не могу понять, как получить только player_id для строки команды H и player_id для строки команды A в homePlayerIds иawayPlayerIds соответственно.

Я видел аннотации @Discriminator, но, похоже, они работают только с наследованием.

@Entity
class Game {
    
    @Id
    private Long id

    @ElementCollection
    @CollectionTable(name = "game_player_team", joinColumns = {@JoinColumn(name = "game_id")})
    @Column(name = "player_id")
    private List<Long> homePlayerIds;

    @ElementCollection
    @CollectionTable(name = "game_player_team", joinColumns = {@JoinColumn(name = "game_id")})
    @Column(name = "player_id")
    private List<Long> awayPlayerIds;


}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать аннотацию @Where, но поскольку вы используете @CollectionTable, вам нужно немного изменить сопоставление.

Это сопоставление будет работать:

    @Entity
    class Game {

        @Id
        public Long id;

        @ElementCollection
        @CollectionTable(name = "game_player_team", joinColumns = {@JoinColumn(name = "game_id")})
        @Column(name = "player_id")
        @Where(clause = "team = 'H'")
        public List<Player> homePlayerIds;

        @ElementCollection
        @CollectionTable(name = "game_player_team", joinColumns = {@JoinColumn(name = "game_id")})
        @Where(clause = "team = 'A'")
        @Column(name = "player_id")
        public List<Player> awayPlayerIds;
    }

    @Embeddable
    class Player {
        @Column(name = "player_id")
        public Long playerId;
        public String team;

        public Player() {
        }

        public Player(Long playerId, String team) {
            this.playerId = playerId;
            this.team = team;
        }
    }

Обратите внимание, что для ассоциаций обычно используется @WhereJoinTable, но, когда я тестировал его, он не работал с @CollectionTable.

Вы можете попробовать использовать что-то вроде этого:

import org.hibernate.annotations.Where;
import javax.persistence.ElementCollection;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;


@Entity
class Game {
    
    @Id
    private Long id

    @ElementCollection
    @JoinTable(name = "game_player_team", 
               joinColumns = @JoinColumn(name = "game_id"))
    @Where(clause = "team = 'H'")
    @Column(name = "player_id")
    private List<Long> homePlayerIds;

    @ElementCollection
    @JoinTable(name = "game_player_team", 
               joinColumns = @JoinColumn(name = "game_id"))
    @Where(clause = "team = 'A'")
    @Column(name = "player_id")
    private List<Long> awayPlayerIds;
}

См. также эту часть документации по гибернации.

Я не думаю, что в данном случае это сработает, потому что team является частью таблицы бриджа.

Davide D'Alto 28.10.2022 00:10

@DavideD'Alto О, я пропустил это. В этом случае мы должны использовать @WhereJoinTable вместо @Where, как упоминается здесь. Я исправил свой ответ.

SternK 28.10.2022 02:24

Я тоже так пробовал, но не работает

Davide D'Alto 28.10.2022 10:11

Другие вопросы по теме