2010-06-26 88 views
8

我有四個實體參與查詢,我遇到了一些問題。的關係如下:Exchange----*Contract*----*Combo----*Trade和(簡體)實體如下:JPA:多對多查詢幫助需要

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

我想要得到一個特定的交換,我不能完全得到與MEMBER OF工作所有交易的列表。任何幫助,將不勝感激。

回答

10

試試這個

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

偉大 - 完美的作品。 – OurKid 2010-07-06 18:37:27

1

不是真的優化,但我認爲這應該做的伎倆:

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

差不多了,但我認爲你錯過了合同中的鏈接。 – OurKid 2010-06-28 17:41:52