Я хочу иметь объект Game, в котором есть два списка идентификаторов игроков, хранящихся как Longs.
Это мой стол: game_player_team
Вот как далеко я продвинулся в моделировании объекта 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;
}




Вы можете использовать аннотацию @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;
}
См. также эту часть документации по гибернации.
@DavideD'Alto О, я пропустил это. В этом случае мы должны использовать @WhereJoinTable вместо @Where, как упоминается здесь. Я исправил свой ответ.
Я тоже так пробовал, но не работает
Я не думаю, что в данном случае это сработает, потому что
teamявляется частью таблицы бриджа.