2017-11-25 9 views
0

次の3つのエンティティを含むTopLinkを使用してJPA問合せを作成しています。左結合のJPA問合せと「存在しません」

@Entity 
@Table(name = "OFFERS") 
public class Offers implements Serializable { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO, generator="offers_seq_gen") 
    @SequenceGenerator(name="offers_seq_gen", sequenceName="OFFERS_SEQ") 
    @Basic(optional = false) 
    @Column(name = "OFFERID") 
    private Long offerid; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "offers", fetch = FetchType.LAZY) 
    private List<Coupons> couponsList; 
} 

@Entity 
@Table(name = "COUPONS") 
public class Coupons implements Serializable { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO, generator="coupons_seq_gen") 
    @SequenceGenerator(name="coupons_seq_gen", sequenceName="COUPONS_SEQ") 
    @Basic(optional = false) 
    @Column(name = "COUPONID") 
    private Long couponid; 

    @Basic(optional = false) 
    @Column(name = "ISSUED", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date issued; 

    @JoinColumn(name = "USERID", referencedColumnName = "USERID") 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private Users users; 

    @JoinColumn(name = "OFFERID", referencedColumnName = "OFFERID") 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private Offers offers; 

@Entity 
@Table(name = "USERS") 
public class Users implements Serializable { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO, generator="users_seq_gen") 
    @SequenceGenerator(name="users_seq_gen", sequenceName="USERS_SEQ") 
    @Basic(optional = false) 
    @Column(name = "USERID") 
    private Long userid; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "users", fetch = FetchType.LAZY) 
    private List<Coupons> couponsList; 

は、私はどちらかが一日以上前に発行された、指定されたユーザーのためのクーポンやユーザーのすべてのクーポンを持っていないすべてのオファーを見つける必要があります。 私は多くの異なったアプローチを試みていると展開にサーバーをクラッシュしない、私は今のところ出ている唯一のクエリは、次のとおりです。

SELECT o 
FROM Offers o 
LEFT JOIN o.couponsList c 
WHERE 
    c.users.userid = :userid AND c.issued < :yesterday 
    OR 
    NOT EXISTS 
     (SELECT c1 
     FROM Coupons c1 
     WHERE c1.offers = o AND c1.users.userid = :userid) 

しかし、クーポンのエントリが存在しない場合には、オファーを返しません。 。

+0

ターンのSQLのログと生成されたSQLがどのように見えるかを見て、その後、あなたは何が間違って表示されます。参考のためにここでそれを残して誰もが同じような問題があった場合 –

答えて

0

私は実際のクエリを見つけることができました。

SELECT o FROM Offers o WHERE 
    NOT EXISTS 
     (SELECT c FROM Coupons c WHERE c.users.userid = :userid 
      AND c.issued > :yesterday AND c.offers = o) 
    OR NOT EXISTS 
     (SELECT c1 FROM Coupons c1 WHERE c1.offers = o 
      AND c1.users.userid = :userid) 
関連する問題