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 .
Schalten Sie die SQL-Anmeldung ein und schauen Sie, wie das generierte SQL aussieht und dann sehen Sie, was falsch ist –