2010-06-26 9 views
8

J'ai quatre entités impliquées dans une requête avec laquelle j'ai un problème. La relation est la suivante: Exchange----*Contract*----*Combo----*Trade et les entités (simplifiées) sont les suivantes:JPA: Aide de requête many to many requise

@Entity 
public class Exchange implements Serializable { 
    @Id(name="EXCHANGE_ID") 
    private long exchangeId; 

    @Column 
    private String exchangeShortName; 
} 


@Entity 
public class Contract implements Serializable { 
     @Id 
     private long contractId; 

     @Column 
     private String contractName; 

     @ManyToOne 
     @JoinColumn(name="EXCHANGE_ID") 
     private Exchange exchange; 

     @ManyToMany 
     @JoinTable(name="CONTRACT_COMBO", 
         joinColumns = { @JoinColumn(name="CONTRACT_ID") }, 
         inverseJoinColumns = {@JoinColumn(name="COMBO_ID")}) 
     private Set<Combo> combos; 

     @Column(name = "ACTIVE_FLAG") 
     private String activeFlag; 
} 

@Entity 
public class Combo implements Serializable { 

     @Id 
     @Column(name="COMBO_ID") 
     private Integer id; 

     @ManyToMany 
     @JoinTable(name="CONTRACT_COMBO", 
         joinColumns = { @JoinColumn(name="COMBO_ID") }, 
         inverseJoinColumns = {@JoinColumn(name="CONTRACT_ID")}) 
     private Set<Contract> legs; 

     @OneToMany(mappedBy = "combo") 
     private Set<Trade> trades;  
} 

@Entity 
public class Trade implements Serializable { 
     @Id 
     @Column(name="TRADE_ID") 
     private long tradeId; 

     @Column(name="REFERENCE") 
     private String reference; 

     @ManyToOne 
     @JoinColumn(name="COMBO_ID") 
     private Combo combo; 
} 

Je veux obtenir une liste de tous les métiers pour un échange particulier que je ne peux pas obtenir assez de travailler avec MEMBER OF. Toute aide serait appréciée.

Répondre

10

Essayez cette

select distinct t 
    from Trade t 
    join t.combo c 
    join c.legs l 
    join l.exchange e 
where e.exchangeShortName = 'whatever' 
+0

Super - fonctionne parfaitement. – OurKid

1

Pas vraiment optimisé, mais je pense que cela devrait faire l'affaire:

Long exchangeId = Long.valueOf(5324623L); 
List<Trade> trades = em.createQuery("select T from Trade T where T in " + 
    "(select distinct C from Combo c where c member of " + 
     "(select e.combos from Exchange e where e.id = :id) " + 
    ")").setParameter("id", exchangeId).getResultList(); 
+0

Presque, mais je pense que vous avez manqué le lien au contrat. – OurKid