简体   繁体   English

具有左联接且“不存在”的JPA查询

[英]JPA query with left join and “not exists”

I am writing a JPA query using TopLink which involves the following three entities. 我正在使用TopLink编写涉及以下三个实体的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;

I need to find all the Offers who either have no coupons for a given user or all the coupons for the user were issued more than a day ago. 我需要找到所有没有为给定用户提供优惠券或为该用户提供的所有优惠券都超过一天的优惠。 I have tried many different approaches and the only query I have come up with so far, which does not crash the server on deployment is: 我尝试了许多不同的方法,到目前为止,我提出的唯一查询不会使服务器在部署时崩溃:

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)

But it does not return the Offer when the Coupons entry does not exist. 但是,当不存在优惠券条目时,它不会返回要约。

I managed to find a working query. 我设法找到一个有效的查询。 Leaving it here for reference if anyone had similar issues: 如果有人遇到类似问题,请留在这里以供参考:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM