2010-06-26 14 views
8

Biraz sorun yaşadığım bir sorguda yer alan dört varlığım var. Exchange----*Contract*----*Combo----*Trade ve aşağıdaki gibi (basitleştirilmiş) varlıklardır:JPA: Pek çok Sorgu için yardım gerekiyor

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

ben oldukça MEMBER OF ile çalışmak için alamayan belirli bir değişim için tüm esnaf bir listesini almak istiyorum şöyle ilişkidir. Herhangi bir yardım takdir edilecektir.

cevap

10

Neredeyse bu

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

Harika - mükemmel çalışıyor. – OurKid

1

gerçekten optimize ama bu hile yapmak gerekir düşünüyorum Değil:

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

deneyin ama Sözleşme bağlantısını cevapsız düşünüyorum. – OurKid

İlgili konular