我们有一个这样的实体模型(为简洁起见,省略了不相关的字段):

@Entity
public class Invoice {
    //The other portion of the sum that is invoiced from another payer.
    @OneToOne(mappedBy = "parentInvoice", cascade = CascadeType.ALL)
    private Invoice otherPayersInvoice;

    //The patient's invoice, which is the parent of this other payer's invoice.
    @OneToOne(cascade = CascadeType.ALL)
    private Invoice parentInvoice;

    @ManyToOne
    private Payer payer;
}


因此,基本上,我们将发票分成多个部分并将关系存储在实体中。

以下查询有效,并按payerId返回所有发票:

SELECT i FROM Invoice i WHERE i.payer.id = :payerId


但是,当我扩展查询以列出付款人可能拥有的所有“子”发票(从其他付款人开具的发票)时,我什么都没有得到,也没有任何错误或警告。

SELECT i FROM Invoice i WHERE i.payer.id = :payerId OR
    (i.parentInvoice IS NOT NULL AND i.parentInvoice.payer.id = :payerId)


这里可能是什么问题?

最佳答案

i.parentInvoice.payer.id


这是进行从发票到其父级到付款人的INNER联接,这将筛选出没有父级或付款人的所有行。

您需要改用外部联接。

SELECT i FROM Invoice i join i.parentInvoice parent join p.payer parentPayer join i.payer payer WHERE payer.id = :payerId OR (parentPayer.id = :payerId)

10-06 02:01