2016-10-10 8 views
0

Criteria APIを使用して、クラスPlayerを階層にManagerと結合する方法はありますか? 私はDAOで与えられたIDのマネージャーを持つすべてのプレイヤーを見つけたいと、このような何かしようとしたと思います: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 
} 
+0

私はあなたのデータモデルは、いくつかの手直しを必要とするかもしれないと思います。 – JimmyB

+0

ありがとうございました。それは変更できないということです。 クラス名は質問のために簡略化されています - 実際はもっと複雑な構造を表しています – Macieyo

+0

'PlayerTeamAssignment'には' manager'というフィールドはありません。 'ManagerAssignment JOIN ...'から 'ManagerAssignment'、すなわち' SELECT ... FROM – JimmyB

答えて

1

を私はすでに私の問題の解決策を見つけました。 は私が

Join<Player, PlayerTeam> playerTeamJoin = root.join(Player_.playerTeam); 
Join<PlayerTeam, PlayerTeamAssignment> playerTeamAssignments = root.join(PlayerTeam_.playerTeamAssignments); 
Path managerPath = ((Path) playerTeamAssignments.as(ManagerAssignment.class)).get(ManagerAssignment_.manager)); 

パスを使用していた、あなたは、述語の例のためにそれを使用することができます。

Predicate predicate = cb.equal(managerPath.get(Manager_.globalId), managerId); 
関連する問題