0
Есть ли способ присоединиться к классу Player с менеджером в иерархии, как показано ниже, с помощью API критериев? Я хотел бы найти все игроки с менеджером данного ID в моем DAO и пытался что-то вроде этого:JPA 2 Критерии объединяются с абстрактной коллекцией
Запрос:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Player> query = cb.createQuery(Player.class);
Root<Player> root = query.from(Player.class);
Join<Player, PlayerTeam> playerTeamJoin = root.join(Player_.playerTeam);
Join<PlayerTeam, PlayerTeamAssignment> playerTeamAssignmentJoin = playerTeamJoin.join(PlayerTeam_.playerTeamAssignments);
// Desired statement:
Predicate predicate = cb.equal(playerTeamAssignmentJoin.get(ManagerAssignment_.manager), manager);
Иерархия классов:
@Entity
class Player {
@OneToOne(mappedBy = "player")
PlayerTeam playerTeam;
}
@Entity
class PlayerTeam {
@JoinColumn(name = "PLAYER_ID", referencedColumnName = "ID")
Player player;
@OneToMany(mappedBy = "playerTeam")
Collection<PlayerTeamAssignment> playerTeamAssignments;
}
@Entity
@DiscriminatorColumn(name = "ASSIGNMENT_TYPE", discriminatorType = DiscriminatorType.STRING)
public abstract class PlayerTeamAssignment { // It has three implementations
@ManyToOne
@JoinColumn(name = "PLAYER_TEAM_ID", referencedColumnName = "ID")
PlayerTeam playerTeam;
}
@Entity
@DiscriminatorValue("INDIVIDUAL")
public class ManagerAssignment extends PlayerTeamAssignment {
@ManyToOne
@JoinColumn(name = "MANAGER_ID", referencedColumnName = "ID")
Manager manager; // id inside
}
Я думаю, что ваша модель данных может потребоваться переделка. – JimmyB
Спасибо за ответ. Дело в том, что оно не может быть изменено. Имена классов упрощены для целей вопроса - на самом деле они представляют собой более сложную структуру. – Macieyo
Обратите внимание, что 'PlayerTeamAssignment' не имеет никакого« диспетчера полей ». Почему бы не начать свой запрос с 'ManagerAssignment', т. Е.' SELECT ... FROM ManagerAssignment JOIN ... '? – JimmyB