2017-11-25 1 views
0

Ich schreibe eine JPA-Abfrage mit TopLink, die die folgenden drei Einheiten umfasst.JPA-Abfrage mit Links Join und "nicht existiert"

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

Ich brauche alle Angebote zu finden, die entweder keine Gutscheine für einen bestimmten Benutzer oder alle Coupons für den Benutzer ausgegeben wurden vor mehr als einem Tag. Ich habe viele verschiedene Ansätze ausprobiert und die einzige Abfrage, die ich bisher mit so gekommen sind, die nicht auf den Server im Einsatz nicht abstürzen ist:

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) 

Aber es ist das Angebot nicht zurück, wenn die Coupons Eintrag existiert nicht .

+0

Schalten Sie die SQL-Anmeldung ein und schauen Sie, wie das generierte SQL aussieht und dann sehen Sie, was falsch ist –

Antwort

0

Ich habe es geschafft, eine funktionierende Abfrage zu finden. Lassen Sie es hier als Referenz, wenn jemand ähnliche Probleme hatte:

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)