我们有一个这样的实体模型(为简洁省略了非相关字段):
@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)
这可能是什么问题?
答案 0 :(得分:2)
i.parentInvoice.payer.id
这是从Invoice到其父级到付款人的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)