奇怪的JPQL问题:添加限制较少的查询参数会返回较少的行

时间:2012-01-18 06:10:56

标签: java jpa jpql

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

@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)

这可能是什么问题?

1 个答案:

答案 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)