Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:需要多对多查询帮助_Java_Hibernate_Jpa_Jpql - Fatal编程技术网

Java JPA:需要多对多查询帮助

Java JPA:需要多对多查询帮助,java,hibernate,jpa,jpql,Java,Hibernate,Jpa,Jpql,我有四个实体涉及到一个查询,我有点麻烦。关系如下:交易所--*合同--*联合体--*交易和简化实体如下: @Entity public class Exchange implements Serializable { @Id(name="EXCHANGE_ID") private long exchangeId; @Column private String exchangeShortName; } @Entity public class Contract

我有四个实体涉及到一个查询,我有点麻烦。关系如下:交易所--*合同--*联合体--*交易和简化实体如下:

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

我想得到一份特定交易所的所有交易的清单,但我不能很好地与该交易所的会员合作。任何帮助都将不胜感激。

没有真正优化,但我认为这应该可以做到:

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();
试试这个

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

差不多了,但我想你错过了合同的链接。