2010-06-26 12 views
8

Ich habe vier Entitäten, die in einer Abfrage beteiligt sind, mit denen ich ein wenig Probleme habe. Die Beziehung ist wie folgt: Exchange----*Contract*----*Combo----*Trade und die (vereinfacht) Einheiten sind wie folgt:JPA: Viele bis viele Query-Hilfe benötigt

@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; 
} 

Ich möchte für einen bestimmten Austausch eine Liste aller Gewerke bekommen, die ich kann nicht ganz mit MEMBER OF zu arbeiten. Jede Hilfe wäre willkommen.

Antwort

10

dieses

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

Großartig - funktioniert perfekt. – OurKid

1

Nicht wirklich optimiert, aber ich denke, das ist der Trick tun sollten:

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

Fast, aber ich denke, Sie auf den Link zu verpassen Vertrag. – OurKid