我们有一个这样的实体模型(为简洁起见,省略了不相关的字段):
@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)