JPA: как разбить результат объединения на списки с собственными сопоставлениями запросов
Я должен решить эту проблему с помощью собственного сопоставления запросов (это единственный способ, который я могу сделать).
Это объект игрока:
@SqlResultSetMapping(
name = "PlayerMapping",
entities = {
@EntityResult(
entityClass = PlayerEntity.class,
fields = {
@FieldResult(name = "idPlayer", column = "id_player"),
@FieldResult(name = "name", column = "nome"),
@FieldResult(name = "nachname", column = "cognome"),
@FieldResult(name = "team", column = "team")
}),
@EntityResult(
entityClass = TeamEntity.class,
fields = {
@FieldResult(name = "id", column = "team_id"),
@FieldResult(name = "name", column = "team_name"),
@FieldResult(name = "stadt", column = "team_city"),
})})
@Entity
@Table(name = "Player")
public class PlayerEntity {
@Id
@GeneratedValue
int idPlayer;
@Column(name = "nome")
String name;
@Column(name = "cognome")
String nachname;
@Column(name = "team")
String team;
**Getter, Setter, Constructor...**
}
Здесь сущность команды:
@Entity
@Table(name = "Team")
public class TeamEntity {
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
int id;
@Column(name = "name")
String name;
@Column(name = "city")
String stadt;
@Override
public String toString() {
return "TeamEntity [id=" + id + ", name=" + name + ", stadt=" + stadt + "]";
}
**Getter, Setter, Constructor...**
}
И вот основной метод для теста:
TeamEntity team1 = new TeamEntity("Milan", "Milano");
TeamEntity team2 = new TeamEntity("Fiorentina", "Firenze");
PlayerEntity spieler1 = new PlayerEntity("Gattuso", "Ringhio", "Milan");
PlayerEntity spieler2 = new PlayerEntity("Andrea", "Pirlo", "Milan");
PlayerEntity spieler3 = new PlayerEntity("Paolo ", "Maldini", "Milan");
PlayerEntity spieler4 = new PlayerEntity("Antonio", "Gilardino", "Fiorentina");
teamEntityRepository.save(team1);
teamEntityRepository.save(team2);
spielerRepository.save(spieler1);
spielerRepository.save(spieler2);
spielerRepository.save(spieler3);
spielerRepository.save(spieler4);
Query q = em.createNativeQuery("SELECT s.id_player, s.cognome, s.nome, s.team, t.id as team_id, t.name as team_name, t.city as team_city FROM Prova.player s join Prova.Team t on (t.name = s.team)", "PlayerMapping" );
List<Object[]> query = q.getResultList();
for (Object[] a: query) {
System.out.println(a [0].toString());
System.out.println(a [1].toString());
}
Это выход:
SpielerEntity [idPlayer=3, name=Gattuso, nachname=Ringhio, team=Milan]
TeamEntity [id=1, name=Milan, stadt=Milano]
SpielerEntity [idPlayer=4, name=Andrea, nachname=Pirlo, team=Milan]
TeamEntity [id=1, name=Milan, stadt=Milano]
SpielerEntity [idPlayer=5, name=Paolo , nachname=Maldini, team=Milan]
TeamEntity [id=1, name=Milan, stadt=Milano]
SpielerEntity [idPlayer=6, name=Antonio, nachname=Gilardino, team=Fiorentina]
TeamEntity [id=2, name=Fiorentina, stadt=Firenze]
Проблема в том, что я хочу получить список игроков, разделенный на команды. Моя идея состояла в том, чтобы создать еще одну команду Pojo, со списком, содержащим весь Player. Подобно:
public class TeamPojo {
int id;
String name;
String stadt;
List<PlayerEntity> players;
}
Можно ли сопоставить что-то подобное? Спасибо.