0
是否有任何方式使用Criteria API加入具有Manager層次結構的Player類,如下所示: 我想找到與給定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'沒有字段'manager'。爲什麼不從'ManagerAssignment'開始查詢,即'SELECT ... FROM ManagerAssignment JOIN ...'? – JimmyB